Изменение выбора ListBox не приводит к перемещению изменений из BindingSource в DataSet.

StackOverflow https://stackoverflow.com/questions/609052

Вопрос

Ответ на этот вопрос может оказаться: «Не используйте типированные наборы данных без использования навигатора для привязки». Однако мне любопытно о поведении, которое я вижу.

Итак, я создал форму, в которой каждый элемент управления был перетащен из проводника источников данных.Я удалил 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();
            }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top