WinForms、BindingSource、CurrentItemの変更を防止
-
05-07-2019 - |
質問
bindingSourceの現在のアイテムが変更されないようにするにはどうすればよいですか? (キャンセル引数を持つ変更イベントはありません...)
これはシナリオです:
- 同じフォームにdataGridViewとテキストボックスがあります。
- テキストボックスを使用してデータソースの値を変更しています(標準のデータバインディングを使用)
-
バインディングは手動で書き込まれます(保存ボタンをクリックした後)
-
ユーザーがDataGridViewを使用して別の行を選択すると、bindingSource.Currentプロパティが変更され、選択した行の値でテキストボックスが更新されます。ユーザーが入力した変更は失われます。
この問題を防ぐ方法はありますか?
bindingSource.Currentプロパティが変更されないようにできますか?
この動作を防ぐためのより良いオプションはありますか?
(dataGridViewの無効化は残念ながらオプションではありません)
解決
bindingSource.Current
を変更したくないようですが、現在の行を変更する前にテキストボックスの内容を保存したいですか? collection を bindingSource
にバインドしている場合、テキストボックスはそのコレクション内の現在の要素のプロパティを参照していませんか?
あなたが何をしようとしているのか本当に分かりませんが、暗闇の中でのショットは、同じ DataSource
を2つの異なる BindingSource
オブジェクトにバインドすることです。このようなもの:
gridBindingSource.DataSource = theDataSource;
textBoxBindingSource.DataSource = theDataSource;
myDataGrid.DataSource = gridBindingSource;
firstNameTextBox.Bindings.Add (new Binding ("Text", textBoxBindingSource, "FirstName"));
ただし、これは奇妙です。 theDataSource
がグリッドコントロールに適している場合、 FirstName
を持つもののコレクションであるためです。プロパティ。たぶん質問でもっと具体的だったら。
ETA:テキストボックスの内容を現在の行に保存する場合は、 bindingSource.Current
プロパティが変更される前に、コンテナで ValidateChildren()
を呼び出します。
他のヒント
グリッドとテキストボックスの両方が同じフォームにある、似たようなフレームワークがあります。ユーザーが[編集]ボタン(または[追加])をクリックすると、gridviewコントロール自体が無効になります...
MyDataGrid.Enabled = false;
編集を続ける..
[保存]で、すべてが問題なければ、
MyDataGrid.Enabled = true;