Winforms C #. Попытка заставить Ctrl-Enter на ComboBox выполнять специфические для программы вещи, а не что-нибудь еще.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ComboBox cb = new ComboBox();
cb.DropDownStyle = ComboBoxStyle.DropDownList;
cb.AutoCompleteSource = AutoCompleteSource.ListItems;
cb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cb.Location = new System.Drawing.Point(20,50);
cb.KeyDown += new System.Windows.Forms.KeyEventHandler(CBKeyDown);
cb.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(CBPreviewKeyDown);
cb.KeyPress += new System.Windows.Forms.KeyPressEventHandler(CBKeyPress);
this.Controls.Add(cb);
List<string> someThings = new List<string>();
someThings.Add("An item");
someThings.Add("Another item");
cb.DataSource = someThings;
}
private void CBPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Enter:
if (e.Control)
{
e.IsInputKey = true;
}
break;
}
}
private void CBKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Enter:
if (e.Control)
{
//Do application specific stuff
e.Handled = true;
}
break;
}
}
private void CBKeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\n')
{
e.Handled = true;
}
}
}
Когда ComboBox имеет фокус, и я нажимаю Ctrl-Enter, раскрывающееся меню ComboBox появляется в ответ на нажатие клавиши, даже если я установил e.handled = true
. Я подтвердил, что проблема связана с функцией ComboBox AutoCompleteMode Suggest. Если эта строка закомментирована или изменена на «Добавить», она прекращает это делать. Но мне нравится функция автозаполнения, и я хочу сохранить ее, если смогу.
Я прошел с отладчиком и убедился, что раскрывающийся список появляется после того, как код прошел через e.handled = true в событии KeyDown, но до того, как событие KeyPress произойдет.
Как я могу заставить ComboBox не отвечать на Ctrl-Enter, за исключением случаев, когда я прямо указываю?