ListBox и Datasource - исключить выбор первого элемента
Эй. У меня есть следующий код, который заполняет мой список
UsersListBox.DataSource = GrpList;
Однако после заполнения поля первый элемент в списке выбирается по умолчанию и срабатывает событие "selected index changed". Как запретить выбор элемента сразу после заполнения списка, или как я могу предотвратить запуск события?
Спасибо
Ответы
Ответ 1
Чтобы удержать событие от огня, вот два варианта, которые я использовал в прошлом:
-
Отмените регистрацию обработчика событий при настройке DataSource.
UsersListBox.SelectedIndexChanged -= UsersListBox_SelectedIndexChanged;
UsersListBox.DataSource = GrpList;
UsersListBox.SelectedIndex = -1; // This optional line keeps the first item from being selected.
UsersListBox.SelectedIndexChanged += UsersListBox_SelectedIndexChanged;
-
Создайте булевский флаг, чтобы игнорировать событие.
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
Ну, похоже, что первый элемент автоматически выбирается после установки 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;
Ответ 3
i, используя следующее, похоже, работает для меня:
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 Qaru Exception
listBox.SelectedIndexChanged -= listBox_SelectedIndexChanged;
listBox.SetSelected(0, false);
listBox.SelectedIndexChanged += listBox_SelectedIndexChanged;
}
}
Ответ 4
установите IsSynchronizedWithCurrentItem="False"
и также SelectedIndex=-1
, и каждая вещь должна работать для вас
Ответ 5
Если вы просто хотите очистить выбранное значение, вы можете использовать ClearSelected после установки DataSource. Но если вы не хотите, чтобы событие срабатывало, вам придется использовать один из методов Джозефа.
Ответ 6
Возможно, в DataSourceChanged вы можете проверить состояние SelectedIndex, если вам повезет, вы можете просто заставить SelectedIndex = -1.