Как можно отменить событие C# Windows Forms ComboBox.PreviewKeyDown? - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу отменить событие Windows Forms ComboBox.PreviewKeyDown, потому что оно, похоже, всегда запускает дублирующиеся события. Я бы предпочел только 1 событие для каждого нажатия клавиши.

Например:

  1. Создать новое приложение C# Windows Forms (я пробовал. NET 4.6. 2 и 4.7.2)

  2. Добавить ComboBox и TextBox в основную форму

  3. Установить textBox1.Multiline = true;

  4. Добавьте код обработчика события comboBox1.PreviewKeyDown для добавления результатов к textBox1.Text

  5. Выполните и наблюдайте каждое нажатие клавиши в comboBox1, запускающее событие PreviewKeyDown 2 раза!

using System.Windows.Forms;

namespace ComboBox_Bounce
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      // Hookup event here in code, not in the Designer
      this.comboBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.comboBox1_PreviewKeyDown);
    }

    private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
      this.textBox1.Text += "comboBox1_PreviewKeyDown=" + e.KeyCode.ToString() +  + System.Environment.NewLine;
    }
  }
}

enter image description here

Платформа: Visual Studio 16.5.4, Windows 10 [1809] все текущие обновления.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Control.PreviewKeyDown следует использовать только для проверки конкретного нажатия клавиши, а затем для установки Control.IsInputKey в значение true, если это так, в противном случае следует использовать обработчик событий Control.KeyDown.

См. Событие Control.PreviewKeyDown

0 голосов
/ 16 апреля 2020

Реализация Ответ ChrisBD выше работает для примера:

using System.Windows.Forms;

namespace ComboBox_Bounce
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      this.comboBox1.PreviewKeyDown += this.comboBox1_PreviewKeyDown;
      this.comboBox1.KeyDown += ComboBox1_KeyDown;
    }

    private void ComboBox1_KeyDown(object sender, KeyEventArgs e)
    {
      this.textBox1.Text += "comboBox1_KeyDown=" + e.KeyCode.ToString() + System.Environment.NewLine;
    }

    private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
      this.textBox1.Text += "comboBox1_PreviewKeyDown=" + e.KeyCode.ToString() + System.Environment.NewLine;
      e.IsInputKey = true;
    }
  }
}

enter image description here

...