1

奇妙なToolStripButtonダブルクリックの問題が見つかりました。次の手順で問題を再現します。

  1. Windows フォーム アプリケーションを作成します。
  2. ToolStripメイン フォームに a を追加します。
  3. に を追加ToolStripButtonToolStripます。
  4. OpenFileDialogメイン フォームにを追加します。
  5. ToolStripButtonプロパティ ツールボックスでのClickイベントをダブルクリックします。
  6. toolStripButton1_Clickこれをメソッドに追加します:

    openFileDialog1.ShowDialog();
    
  7. デバッグを開始します。
  8. をすばやくダブルクリックしますToolStripButton

ここで問題が発生します。まず、ファイルを開くダイアログが表示され、それを閉じると、別のダイアログが表示されます。これは起こるべきではありません。もう一度閉じると、メインフォームに再描画の問題が発生する可能性があります。最後に、メイン フォームを閉じますが、プログラムはまだ実行されています。

自分で試してみて、それらすべてが発生した場合はお知らせください。

なぜそれらが起こるのですか?それを解決するにはどうすればよいですか?

これを使用して問題を再現できます。

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());
        }
    }
}
4

2 に答える 2

1

なぜそれらが起こるのですか?

本当にわからない、驚きです!!

それを解決するにはどうすればよいですか?

これは簡単な回避策です。

private bool clicked = false;
private void toolStripButton1_Click(object sender, EventArgs e)
{
    if (clicked) return;
    clicked = true;
    openFileDialog1.ShowDialog();
    clicked = false;
}

編集:
問題はそれ自体をダブルクリックすることではなく、OpenFileDialog動作にあると思います。
このコードを試してみると、(偶発的な)ダブルクリックでもエラーが消えます。

private void toolStripButton1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog dlg = new OpenFileDialog()
    {
        Title = "Open file",
        Filter = "PDF files|*.pdf|All files|*.*"
    })
    {
        dlg.ShowDialog();
        Debug.WriteLine(dlg.FileName);
    }
}

エラーを使用tsb1.DoubleClickEnabled = trueすると消えます...しかし、これが良い解決策かどうかはわかりません

于 2012-03-30T10:14:49.117 に答える
1

これを使用することにしました(今のところ):

private void toolStripButton1_Click(object sender, EventArgs e)
{
    toolStripButton1.Enabled = false;
    openFileDialog1.ShowDialog();
    toolStripButton1.Enabled = true;
}
于 2012-03-30T11:09:25.813 に答える