Выпадающий список C# winforms combobox нажмите enter и нажмите кнопку
Привет.
У меня есть пользовательский класс, основанный на ComboBox, в Winforms. Он установлен как выпадающий список, так как я хочу только выбрать элемент, а не вставлять или изменять его текстовую область.
Я хочу, чтобы он отбрасывал свой список, когда у него есть фокус, с клавиатуры, повторяя элементы формы с помощью клавиши TAB, в отпуске, чтобы закрыть свой отброшенный список. Все работает нормально, имея этот код в методах Enter и Leave (in Что я уже пробовал, это то, что у меня есть, консольные линии предназначены только для отладки):
Проблема в том, что я щелкаю по нему мышью. Список будет выпадать, закрываться и снова открываться.
Порядок событий, запускаемых при щелчке мыши, если этот элемент управления не имеет фокуса, - это Enter, а затем MouseClick, событие Leave не срабатывает, поэтому я не знаю, почему DropDownList закрывается!
Как сделать так, чтобы он упал только один раз, если фокус не на нем, и я щелкаю мышью?
Что я уже пробовал:
private void MyNewComboBoxCheckable_SelectionChangeCommitted(object sender, EventArgs e) { SuspendLayout(); if (readOnly) { SelectedIndex = prevIndex; Console.WriteLine("SelectionChangeCommited"); } ResumeLayout(false); } private void MyNewComboBoxCheckable_Enter(object sender, EventArgs e) { prevIndex = SelectedIndex; if (ReadOnly == false) { BorderColor = Color.Red; if (!DroppedDown && Droppable) { DroppedDown = true; Console.WriteLine("Enter - Dropped = set to true, {0}", DroppedDown); } } Invalidate(); } private void MyNewComboBoxCheckable_Leave(object sender, EventArgs e) { DroppedDown = false; BorderColor = Color.DarkGray; Invalidate(); Console.WriteLine("Leave - Dropped = false"); } private void MyNewComboBoxCheckable_MouseClick(object sender, MouseEventArgs e) { DroppedDown = true; Console.WriteLine("MouseClick"); } protected override void WndProc(ref Message m) { if (ReadOnly) { switch (m.Msg) { case 0x201: case 0x203: break; default: base.WndProc(ref m); break; } } else { base.WndProc(ref m); } if (m.Msg == WM_PAINT) { using (var g = Graphics.FromHwnd(Handle)) { // Uncomment this if you don't want the "highlight border". using (var p = new Pen(this.BorderColor, 1)) { g.DrawRectangle(p, 0, 0, Width - 1, Height - 1); } } } }
Richard MacCutchan
"У меня есть пользовательский класс, основанный на ComboBox, в Winforms. Он установлен как выпадающий список, так как я хочу только выбрать элемент, а не вставлять или изменять его текстовую область."
Так почему бы не сделать его простым для себя и не использовать Класс ListBox (System.Окна.Формы) | Microsoft Docs[^]?
Vali Maties
Из-за пространства на форме...
Картинка с элементами управления в форме
Maciej Los
Может ли пользователь выбрать (checked=true) только один элемент или их много?
Vali Maties
Я не вижу релевантности, но нет, он выберет только одну запись.
Отредактировано: а также, я не вижу никакого свойства в WinForms Combobox "проверено"!
Кстати, этот маленький проверенный значок перед текстом ComboBox показывает пользователю, активна ли эта запись или нет.
Maciej Los
ОК. Спасибо за ответ.
Пожалуйста, смотрите мой ответ.
Vali Maties
Спасибо @Maciej , я нашел проблему и решение, благодаря вам. Отладчик был спасением, а вы с идеей :)