#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».
- Если выбрано «b» и оно удалено из
BindingSource
,ComboBox.SelectedItem
значение изменится на «c». - Если выбрано «b», а «a» удалено из
BindingSource
,ComboBox.SelectedItem
это не изменится. - Если «d» выбран, а затем удален,
ComboBox.SelectedItem
изменится на «c».