2012-03-30 2 views
1

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

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

Вы используете 'Click' событие ToolStripButton, которая отвечает на * одним нажатием кнопки *, то почему вы * двойной щелчок * на нем? – Coder

+0

Я дважды щелкнул его случайно, и я нашел эту проблему.Я имею в виду, если кто-то дважды нажимает кнопку, это не должно вызывать проблемы, верно? – EFanZh

+0

Да, но это не объясняет, почему приложение все еще работает, когда OP закрывает его (это случается, я пытался) – Marco

ответ

1

я решил использовать это (сейчас):

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    toolStripButton1.Enabled = false; 
    openFileDialog1.ShowDialog(); 
    toolStripButton1.Enabled = true; 
} 
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 ошибка исчезнет ... но я не уверен, что это хорошее решение

+0

@EFanZh: вы попробовали мой код? Он решил проблему на моем компьютере ... теперь я ищу, почему приложение не закрывается должным образом. – Marco

+0

Да, кажется, ваш код работает, но это для каждого ToolStripButton? Есть много работы. – EFanZh

+0

@EFanZh: Я думаю, что проблема находится в 'OpenFileDialog', а не в самой кнопке ... Я продолжаю с некоторого reasearch ... – Marco

Смежные вопросы