トップ回答者
DataSetの更新が必要な時を検知

質問
-
データが編集されると、保存ボタンが有効になる処理を作りたいです。
DataSetが変更されたかどうかは、HasChanges()で検出できますが、
それが必要になった時点のイベントは、何が適切でしょうか?
CellValueChanged()のイベントも拾えますが、値が変化しないときはイベントが発生しません。
0のときキーボードから0を入力してもイベントは発生しません。
しかし、この時でもHasChangesはtrueになります。
編集されても値が変化しないのでCellValueChangedが適切な気もしますが
本来はどのタイミングが適切でしょうか?
回答
すべての返信
-
「データが編集されると」という意味はわかりますが、編集された時にエラーがあった場合でも保存ボタンが有効になるのでしょうか? できれば、データが編集されてもエラーがある状態では保存ボタンが有効にならない方が良いと思います。
いずれにしても直接DataSetを編集するのではなく、一度UIバインドオブジェクトで受けておき、保存ボタンを押した段階でDataSetに書き出し、そこからデータベースに保存するのが実現に近いように思います。UIバインドオブジェクトは以下を参考にして下さい。Part 2. スマートクライアントにおける単体入力データ検証
http://blogs.msdn.com/b/nakama/archive/2009/02/26/part-2.aspx
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
EditingControlShowingイベントハンドラで、そのTextBoxのTextChangedイベントをリッスンするイベントハンドラを結びつけるしかありません。以下に掲載されているコードを参考にしてみて下さい。
DataGridViewComboBoxEditingControl クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewcomboboxeditingcontrol.aspx
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
trapemiyaさん
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { TextBox text = (TextBox)e.Control; if (text != null) { text.TextChanged -= new EventHandler(TextBox_TextChanged); text.TextChanged += new EventHandler(TextBox_TextChanged); } } private void TextBox_TextChanged(object sender, EventArgs e) { buttonSave.Enabled = true; }
こんな感じだと思いますが、TextBoxが生成されたときに初期値がセットされると
TextChangedが呼び出されるので、フラグを用意して初回のみ無視するのが
ベターでしょうか。