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.