ListBoxの選択を変更しても、変更がBindingSourceからDataSetに移動されません
-
03-07-2019 - |
質問
この質問に対する答えは、「バインディングナビゲータを使用せずに型指定されたデータセットを使用しないでください」であることが判明する場合があります。 しかし、私は私が見ている行動に興味があります。
そこで、すべてのコントロールがデータソースエクスプローラーからドラッグされるフォームを作成しました。
この特定のフォームにはくて不適切であるため、Binding Navigatorを削除しました。
ListBoxを追加し、DataSourceをBindingSourceに設定しました。
ListBoxはバインドされておらず、BindingSourceからそれ自体を埋めていることに注意してください。
私が期待していなかった魔法によって、ListBox内を移動するとBindingSourceがナビゲートされ、他のすべてのコントロールがそれに応じて更新されます。
バインドされたコントロールを変更し、BindingSourceでEndEditを明示的に呼び出してから、テーブルアダプターを介してDataSourceを更新できます。すばらしい。
バインドされたコントロールを変更して、ListBoxの新しいオプションをクリックすると、変更を確認し、保存がある場合は保存またはリセットするように求めることができます。
ここに、私が理解できなかった奇妙な部分があります。
どのイベントにアタッチしても、DataSet.HasChangesは2番目のListBoxが変更されるまでtrueを返しません。 私は何十もの提案を検索して試してみましたが、それらのほとんどはとんでもないものでしたが、いくつかは有望と思われました。 運がありません。
編集:重要なのは2回目のクリックではなく、元の(編集済みの)アイテムをクリックして戻ったときです。
解決
質問をしてから、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();
}
}
}