Winforms: как правильно открыть combobox? - PullRequest
16 голосов
/ 27 апреля 2011

У меня есть поле со списком на winforms. На Enter даже я его открываю:

cbo.DroppedDown = true;

Но если я сделаю это, комбо открывается и закрывается немедленно. Что я делаю не так?

Причина, по которой я использую это событие, заключается в том, что мне нужно открыть комбо на вкладке. Когда пользователь нажимает вкладку на предыдущем элементе управления, это комбо открывается правильно. Но если пользователь нажимает комбо, оно открывается и закрывается. Как это сделать правильно?

Спасибо

Ответы [ 5 ]

20 голосов
/ 27 апреля 2011

Я попробовал это так:

private void comboBox1_enter(object sender, EventArgs e)
      {
         comboBox1.DroppedDown = true;
      }

без изменений для mouseup или таймеров. он вел себя так, как ожидалось. Независимо от того, выбрал ли я comboBox щелчком мыши или вкладкой, в нем появился раскрывающийся список, который оставался открытым до тех пор, пока я что-то не выбрал.

Я бы посмотрел, есть ли что-то еще, отвлекающее фокус от коробки.

3 голосов
/ 27 апреля 2011

Причиной возникновения этой проблемы является то, что событие mouseup происходит после события enter, а процедура окна по умолчанию закрывает поле со списком.

При вводе вы можете проверить состояние кнопки мыши и, если кнопка нажата, не открывать комбо. Затем создайте другой обработчик события mouseup, чтобы открыть комбо.

Другой вариант - установить таймер на несколько миллисекунд и открыть комбо, когда оно отключится.

2 голосов
/ 09 декабря 2016

Зная, что это немного устарело, но я обнаружил, что это работает хорошо.Вы можете нажать TAB в поле со списком, когда оно откроется, и если вы нажмете стрелку, оно не закроется снова.

private void ComboBox_Enter(object sender, EventArgs e)
    {            
        if (MouseButtons == MouseButtons.None)
            ((System.Windows.Forms.ComboBox)sender).DroppedDown = true;
    }
0 голосов
/ 15 ноября 2016

Я думаю, вам просто нужно сначала сфокусировать его, прежде чем открывать поле со списком.

cbo.Focus();
cbo.DroppedDown = True

Надеюсь, это работает для вас.

0 голосов
/ 04 ноября 2016

Установить DroppedDown = true в событии GotFocus комбинированного списка.В противном случае раскрывающийся список будет отображаться в неверном месте.

void cbo_GotFocus(object sender, EventArgs e)
    {
        ComboBox cbo = sender as ComboBox;
        cbo.DroppedDown = true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...