Windows Forms, как узнать, был ли выбранный индекс изменен пользователем или кодом - PullRequest
5 голосов
/ 19 ноября 2010

У меня есть выпадающий список в проекте Windows Forms с событием, прикрепленным к событию selectedindex измененный.Событие запускается, когда выбранный индекс изменяется как из кода, так и из пользовательского ввода.Как определить, изменяется ли выбранный индекс из-за пользовательского ввода?

Ответы [ 4 ]

9 голосов
/ 19 ноября 2010

Можно ли вместо этого использовать SelectionChangeCommitted событие?

SelectionChangeCommitted вызывается только тогда, когда пользователь меняет выделение комбинированного окна

РЕДАКТИРОВАТЬ:Событие SelectionChangeCommitted имеет серьезный сбой: если вы используете F4 для выпадающего списка, а затем наведите курсор на выделение и используйте клавишу Tab для перехода к следующему элементу управления, оно не срабатывает.

Там [закрыто и удалено] ошибка в Подключите о ней, что также предполагает использование события DropDownClosed для отлова этого более подходящего случая.

5 голосов
/ 19 ноября 2010

Я застрял в ситуациях, когда изменение пользовательского интерфейса распространяется на модель, затем изменение модели распространяется обратно на пользовательский интерфейс, и это создает бесконечный цикл. Вы имеете дело с чем-то подобным?

Если это так, единственным выходом является обновление пользовательского интерфейса только из модели, только если они отличаются. То есть:

if (comboBox.SelectedItem != newValue)
    comboBox.SelectedItem = newValue;

Если это не дает того, что вы хотите, другой вариант - временно удалить обработчик событий:

comboBox.SelectedIndexChanged -= this.comboBox_SelectedIndexChanged;
comboBox.SelectedIndex = newIndex;
comboBox.SelectedIndexChanged += this.comboBox_SelectedIndexChanged;

или, дать указание обработчику игнорировать это событие:

ignoreComboBoxEvents = true;
comboBox.SelectedIndex = newIndex;
ignoreComboBoxEvents = false;
...
public void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ignoreComboBoxEvents)
        return;
    ...
}
0 голосов
/ 19 ноября 2010

Вы можете установить логический флаг всякий раз, когда выбранный индекс изменяется кодом, и обработчик может прервать (сбросить флаг), когда этот флаг установлен.

0 голосов
/ 19 ноября 2010

Ваш обработчик событий вызывается только после пользовательского ввода, а не после кода, изменяющего индекс.Либо обработайте этот случай там, либо установите там логический флаг, говоря, что это был ввод пользователя, чтобы другая часть кода могла видеть, что последнее изменение индекса было связано с вводом пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...