Изменение выбора ListBox не приводит к перемещению изменений из BindingSource в DataSet.
-
03-07-2019 - |
Вопрос
Ответ на этот вопрос может оказаться: «Не используйте типированные наборы данных без использования навигатора для привязки». Однако мне любопытно о поведении, которое я вижу.
Итак, я создал форму, в которой каждый элемент управления был перетащен из проводника источников данных.Я удалил Binding Navigator, потому что он уродлив и не подходит для этой конкретной формы.Я добавил ListBox и установил в качестве источника данных BindingSource.
Обратите внимание, что ListBox не привязан, он просто заполняется из BindingSource.По какой-то магии, на которую я не рассчитывал, перемещение по ListBox означает навигацию по BindingSource, и все остальные элементы управления обновляются соответствующим образом.
Я могу внести изменения в связанные элементы управления и явно вызвать EndEdit в BindingSource, а затем обновить источник данных через адаптер таблицы.Прекрасно работает.
Когда я вношу изменения в связанные элементы управления и нажимаю новый параметр в ListBox, я хочу иметь возможность проверять изменения и предлагать их сохранить или сбросить, если таковые имеются.
Вот странная часть, которую я не смог понять.
Независимо от того, к какому событию я привязываюсь, DataSet.HasChanges не возвращает true до второго изменения ListBox.Я искал и пробовал десятки предложений, большинство из них были смешными, но некоторые показались многообещающими.Не повезло.
Редактировать:Важен не второй щелчок, а повторный щелчок по исходному (отредактированному) элементу.
Решение
Задав этот вопрос, я узнал немного больше о BindingSources, DataSets и TableAdapter.
Вот что работает:
private void MyListBox_Click(object sender, EventArgs e)
{
this.myBindingSource.EndEdit();
if (myDataSet.HasChanges())
{
if (MessageBox.Show("Save changes?", "Before moving on", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
myTableAdapter.Update(myDataSet.myDataTable);
}
else
{
myDataSet.RejectChanges();
}
}
}