ListBox и Datasource - предотвращают выбор первого элемента - PullRequest
14 голосов
/ 04 июня 2010

Эй. У меня есть следующий код, который заполняет мой список

UsersListBox.DataSource = GrpList;

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

Спасибо

Ответы [ 6 ]

21 голосов
/ 04 июня 2010

Чтобы предотвратить запуск события, вот две опции, которые я использовал в прошлом:

  1. Отмена регистрации обработчика события при настройке источника данных.

    UsersListBox.SelectedIndexChanged -= UsersListBox_SelectedIndexChanged;
    UsersListBox.DataSource = GrpList;
    UsersListBox.SelectedIndex = -1; // This optional line keeps the first item from being selected.
    UsersListBox.SelectedIndexChanged += UsersListBox_SelectedIndexChanged;
    
  2. Создайте логический флаг, чтобы игнорировать событие.

    private bool ignoreSelectedIndexChanged;
    private void UsersListBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ignoreSelectedIndexChanged) return;
        ...
    }
    ...
    ignoreSelectedIndexChanged = true;
    UsersListBox.DataSource = GrpList;
    UsersListBox.SelectedIndex = -1; // This optional line keeps the first item from being selected.
    ignoreSelectedIndexChanged = false;
    
2 голосов
/ 08 марта 2013

Что ж, похоже, что первый элемент автоматически выбирается после установки ListBox.DataSource. Другие решения хороши, но они не решают проблему. Вот как я решил проблему:

// Get the current selection mode
SelectionMode selectionMode = yourListBox.SelectionMode;

// Set the selection mode to none
yourListBox.SelectionMode = SelectionMode.None;

// Set a new DataSource
yourListBox.DataSource = yourList;

// Set back the original selection mode
yourListBox.SelectionMode = selectionMode;
1 голос
/ 08 февраля 2014

я использую следующее, кажется, работает для меня:

List<myClass> selectedItemsList = dataFromSomewhere

//Check if the selectedItemsList and listBox both contain items
if ((selectedItemsList.Count > 0) && (listBox.Items.Count > 0))
{
   //If selectedItemsList does not contain the selected item at 
   //index 0 of the listBox then deselect it
   if (!selectedItemsList.Contains(listBox.Items[0] as myClass))
   {
      //Detach the event so it is not called again when changing the selection
      //otherwise you will get a Stack Overflow Exception
      listBox.SelectedIndexChanged -= listBox_SelectedIndexChanged;
      listBox.SetSelected(0, false);
      listBox.SelectedIndexChanged += listBox_SelectedIndexChanged;
   }
}
0 голосов
/ 19 августа 2016

набор IsSynchronizedWithCurrentItem="False", а также SelectedIndex=-1 и все должно работать на вас

0 голосов
/ 04 июня 2010

Если вы просто хотите очистить выбранное значение, вы можете использовать ClearSelected после установки источника данных. Но если вы не хотите, чтобы событие сработало, вам придется использовать один из методов Джозефа.

0 голосов
/ 04 июня 2010

Возможно, в DataSourceChanged вы могли бы проверить состояние SelectedIndex, если вам повезет, вы можете просто заставить SelectedIndex = -1.

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