none
关于 ToolStripButton 和 OpenFileDialog 的一个奇怪的问题 RRS feed

  • 问题

  • 首先创建一个 Windows 窗体应用程序,然后添加一个 ToolStrip,然后添加一个 ToolStripButton,然后添加一个 OpenFileDialog,编写 ToolStripButton 的 Click 事件为执行 OpenFileDialog.ShowDialog() 方法。

    然后执行程序,以比较快的速度双击 ToolStripButton,然后弹出 OpenFileDialog。把这个 OpenFileDialog 关闭后会有第二个 OpenFileDialog 弹出,关闭后首先界面可能会出现一些重绘问题,然后关闭窗体后程序不能终止。这里可能描述的不太清楚,最好能亲自试一下。

    这是什么情况?

    • 已编辑 EFanZh 2012年3月30日 7:00
    2012年3月30日 6:58

答案

  • 可以重现。就按照第一篇帖子的步骤。

    加这两行代码无效。


    EFanZh

    解决方法:在Click事件:

     private void toolStripButton1_Click(object senderEventArgs e)
            {
                OpenFileDialog f = new OpenFileDialog();
                f.ShowDialog();
            }

    这样每次生成一个新的实例即可。你的f可以是类全局变量。win7没有问题


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月30日 8:49
    版主
  • 我发现这样也可以:

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        toolStripButton1.Enabled = false;
        openFileDialog1.ShowDialog();
        toolStripButton1.Enabled = true;
    }


    EFanZh

    • 已标记为答案 EFanZh 2012年3月30日 11:11
    2012年3月30日 11:11

全部回复

  • 因为一个ToolStriptButton如果双击的话,相当于被拆分成两次单击,估计是程序来不及相应所致。不建议你双击ToolStriptButton。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月30日 8:17
    版主
  • 首先,这个情况确实存在吧?我不确定在别人电脑上是不是也有问题。

    这个发现本身也是不小心手抖了一下所致。如果用户的一个误操作会导致程序异常,这个问题无疑是需要解决的,而不是告诉用户说不能这样操作。


    EFanZh

    2012年3月30日 8:26
  • 首先,这个情况确实存在吧?我不确定在别人电脑上是不是也有问题。

    这个发现本身也是不小心手抖了一下所致。如果用户的一个误操作会导致程序异常,这个问题无疑是需要解决的,而不是告诉用户说不能这样操作。

    是的,你的问题我可以重现……非常奇怪。我认为是这样的——因为OpenDialog非模式的窗体,一次只能出现一个,但是你现在双击,被解析成两个单击事件,结果两次都要弹出这个模式窗体,导致程序崩溃。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月30日 8:28
    版主
  • 可以重现。就按照第一篇帖子的步骤。

    加这两行代码无效。


    EFanZh

    2012年3月30日 8:48
  • 可以重现。就按照第一篇帖子的步骤。

    加这两行代码无效。


    EFanZh

    解决方法:在Click事件:

     private void toolStripButton1_Click(object senderEventArgs e)
            {
                OpenFileDialog f = new OpenFileDialog();
                f.ShowDialog();
            }

    这样每次生成一个新的实例即可。你的f可以是类全局变量。win7没有问题


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月30日 8:49
    版主
  • 这个解决办法不太好,因为我的 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
    2012年3月30日 9:27
  • 我发现这样也可以:

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        toolStripButton1.Enabled = false;
        openFileDialog1.ShowDialog();
        toolStripButton1.Enabled = true;
    }


    EFanZh

    • 已标记为答案 EFanZh 2012年3月30日 11:11
    2012年3月30日 11:11