Странный ToolStripButton нажмите, чтобы открыть поведение OpenFileDialog - PullRequest
1 голос
/ 30 марта 2012

Я обнаружил странную ToolStripButton проблему двойного щелчка. Эти шаги воспроизведут проблему:

  1. Создание приложения Windows Form.
  2. Добавьте ToolStrip в основную форму.
  3. Добавьте ToolStripButton к ToolStrip.
  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());
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Я решил использовать это (пока):

private void toolStripButton1_Click(object sender, EventArgs e)
{
    toolStripButton1.Enabled = false;
    openFileDialog1.ShowDialog();
    toolStripButton1.Enabled = true;
}
1 голос
/ 30 марта 2012

Почему так происходит?

Я действительно не знаю, для меня это сюрприз !!

Что я должен сделать, чтобы решить это?

Это простой обходной путь:

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 ошибка исчезнет ... но я не уверен, что это хорошее решение

...