Вызов ResetBindings в bindingsource для обновления ComboBox приводит к инициализации элемента управления, как обновить элементы без инициализации?

#c# #winforms #data-binding

#c# #винформы #привязка к данным

Вопрос:

У меня есть список строк, который является источником данных для объекта BindingSource, который, в свою очередь, является источником данных для ComboBox.

Когда я изменяю список (добавляю или удаляю строки), я вызываю метод ResetBindings() в BindingSource. Это обновляет элементы в ComboBox, как и ожидалось, но также устанавливает SelectedIndex в ‘0’ вместо неинициализированного значения ‘-1’. Я хочу обновить элементы без инициализации ComboBox

Я уже пытался справиться с этим в SelectedIndexChanged eventhandler следующим образом:

 private void cmbSelectxx_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox cmb = (ComboBox)sender;

   if (!cmb.Focused)
   {
      cmb.SelectedIndexChanged -= new EventHandler(cmbSelectxx_SelectedIndexChanged);
      cmb.SelectedIndex = -1;
      cmb.ResetText();
      cmb.SelectedText = "";
      cmb.SelectedIndexChanged  = new EventHandler(cmbSelectxx_SelectedIndexChanged);
      return;
   }

   //...
}
  

но это не решает мою проблему

Привязка элемента управления к коду данных:

 bs = new BindingSource();
bs.DataSource = SomeList;
cmbSelectxx.DataSource = bs;
  

Ответ №1:

Выполните операции добавления / удаления непосредственно на BindingSource вместо SomeList . Эти операции добавления / удаления распространяются обратно на SomeList . ‘ Обратите внимание, что если текущий выбранный элемент в ComboBox будет удален, он обновится до наиболее подходящего значения.

Предположим, что ваш SomeList содержит значения «a», «b», «c», «d».

  1. Если выбрано «b» и оно удалено из BindingSource , ComboBox.SelectedItem значение изменится на «c».
  2. Если выбрано «b», а «a» удалено из BindingSource , ComboBox.SelectedItem это не изменится.
  3. Если «d» выбран, а затем удален, ComboBox.SelectedItem изменится на «c».