积极答复者
关于 ToolStripButton 和 OpenFileDialog 的一个奇怪的问题

问题
-
首先创建一个 Windows 窗体应用程序,然后添加一个 ToolStrip,然后添加一个 ToolStripButton,然后添加一个 OpenFileDialog,编写 ToolStripButton 的 Click 事件为执行 OpenFileDialog.ShowDialog() 方法。
然后执行程序,以比较快的速度双击 ToolStripButton,然后弹出 OpenFileDialog。把这个 OpenFileDialog 关闭后会有第二个 OpenFileDialog 弹出,关闭后首先界面可能会出现一些重绘问题,然后关闭窗体后程序不能终止。这里可能描述的不太清楚,最好能亲自试一下。
这是什么情况?
- 已编辑 EFanZh 2012年3月30日 7:00
答案
-
可以重现。就按照第一篇帖子的步骤。
加这两行代码无效。
EFanZh
解决方法:在Click事件:
private void toolStripButton1_Click(object sender, EventArgs e)
{
OpenFileDialog f = new OpenFileDialog();
f.ShowDialog();
}这样每次生成一个新的实例即可。你的f可以是类全局变量。win7没有问题
- 已编辑 ThankfulHeartModerator 2012年3月30日 8:52
- 已标记为答案 EFanZh 2012年3月30日 11:09
全部回复
-
首先,这个情况确实存在吧?我不确定在别人电脑上是不是也有问题。
这个发现本身也是不小心手抖了一下所致。如果用户的一个误操作会导致程序异常,这个问题无疑是需要解决的,而不是告诉用户说不能这样操作。
是的,你的问题我可以重现……非常奇怪。我认为是这样的——因为OpenDialog非模式的窗体,一次只能出现一个,但是你现在双击,被解析成两个单击事件,结果两次都要弹出这个模式窗体,导致程序崩溃。
- 已编辑 ThankfulHeartModerator 2012年3月30日 8:48
-
可以重现。就按照第一篇帖子的步骤。
加这两行代码无效。
EFanZh
解决方法:在Click事件:
private void toolStripButton1_Click(object sender, EventArgs e)
{
OpenFileDialog f = new OpenFileDialog();
f.ShowDialog();
}这样每次生成一个新的实例即可。你的f可以是类全局变量。win7没有问题
- 已编辑 ThankfulHeartModerator 2012年3月30日 8:52
- 已标记为答案 EFanZh 2012年3月30日 11:09
-
这个解决办法不太好,因为我的 OpenFileDialog 的属性是经过一个复杂的过程才确定下来的,每次创建一个新的实例需要重新设定属性,感觉太麻烦,而且这个解决方法感觉不自然,对于内存资源也是一种浪费(虽然有 GC,但并不能保证及时释放)。
这段代码可以重现问题:
using System; using System.ComponentModel; using System.Windows.Forms; namespace WinForm { class MyForm : Form { private IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { openFileDialog1 = new OpenFileDialog(); toolStrip1 = new ToolStrip(); toolStripButton1 = new ToolStripButton(); toolStrip1.SuspendLayout(); this.SuspendLayout(); toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripButton1 }); toolStripButton1.Text = "toolStripButton1"; toolStripButton1.Click += new EventHandler(toolStripButton1_Click); this.Controls.Add(toolStrip1); toolStrip1.ResumeLayout(false); toolStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } private OpenFileDialog openFileDialog1; private ToolStrip toolStrip1; private ToolStripButton toolStripButton1; public MyForm() { InitializeComponent(); } private void toolStripButton1_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MyForm()); } } }
- 已编辑 EFanZh 2012年3月30日 10:15