Изменение выбора ListBox не переносит изменения из BindingSource в DataSet - PullRequest
0 голосов
/ 04 марта 2009

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

Итак, я создал форму, где каждый элемент управления перетаскивался из проводника источников данных. Я удалил Binding Navigator, потому что он уродлив и не подходит для данной формы. Я добавил ListBox и установил источник данных в BindingSource.
Обратите внимание, что ListBox не связан, он просто заполняет себя из BindingSource. Каким-то волшебством, на которое я не рассчитывал, перемещение по ListBox перемещается по BindingSource, и все остальные элементы управления обновляются соответствующим образом.

Я могу внести изменения в связанные элементы управления и явно вызвать EndEdit в BindingSource, а затем обновить DataSource через адаптер таблицы. Прекрасно работает.

Когда я делаю изменения в связанных элементах управления и щелкаю новую опцию в ListBox, я хочу иметь возможность проверить изменения и предложить сохранить или сбросить их, если они есть.

Вот странная часть, которую я не смог понять.

Независимо от того, к какому событию я присоединяюсь, DataSet.HasChanges не возвращает true, пока второе изменение ListBox не изменится. Я искал и пробовал десятки предложений, большинство из которых были смешными, но некоторые казались многообещающими. Не повезло.

Редактировать: важен не второй щелчок, а когда вы возвращаетесь к исходному (отредактированному) элементу.

1 Ответ

0 голосов
/ 17 марта 2009

С момента постановки вопроса я узнал немного больше о BindingSources, DataSets и TableAdapters.

Вот что работает:

    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();
            }
        }
    }
...