none
DataSetの更新が必要な時を検知 RRS feed

  • 質問

  • データが編集されると、保存ボタンが有効になる処理を作りたいです。

    DataSetが変更されたかどうかは、HasChanges()で検出できますが、

    それが必要になった時点のイベントは、何が適切でしょうか?

    CellValueChanged()のイベントも拾えますが、値が変化しないときはイベントが発生しません。

    0のときキーボードから0を入力してもイベントは発生しません。

    しかし、この時でもHasChangesはtrueになります。

    編集されても値が変化しないのでCellValueChangedが適切な気もしますが

    本来はどのタイミングが適切でしょうか?

    2011年12月12日 9:36

回答

  • 別の方法として、BindingSource の ListChanged イベントは使えないですか?

    私はエラーがあっても保存ボタンはとりあえず押せるようにしていて、保存ボタンで適切なエラーメッセージを表示するようにしてます。

    • 回答としてマーク kgg01234 2011年12月13日 12:05
    2011年12月13日 4:36

すべての返信

  • 「データが編集されると」という意味はわかりますが、編集された時にエラーがあった場合でも保存ボタンが有効になるのでしょうか? できれば、データが編集されてもエラーがある状態では保存ボタンが有効にならない方が良いと思います。
    いずれにしても直接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/
    2011年12月12日 14:54
    モデレータ
  • trapemiyaさま

    ありがとうございます。
    BindingSourceは経由して編集しているのですが、TextBoxなどで項目毎に
    編集するUIではなく、DataGridViewで編集するデザインで作っておりまして、
    編集された時が知りたかったです。

    EditingControlShowingで表示されるTextBoxなどのTextChangedのイベントが
    拾えれば良いのですが。

    • 編集済み kgg01234 2011年12月13日 1:23
    2011年12月13日 1:22
  • 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/
    2011年12月13日 2:20
    モデレータ
  • 別の方法として、BindingSource の ListChanged イベントは使えないですか?

    私はエラーがあっても保存ボタンはとりあえず押せるようにしていて、保存ボタンで適切なエラーメッセージを表示するようにしてます。

    • 回答としてマーク kgg01234 2011年12月13日 12:05
    2011年12月13日 4:36
  • 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が呼び出されるので、フラグを用意して初回のみ無視するのが
    ベターでしょうか。
    • 回答としてマーク kgg01234 2011年12月13日 12:06
    • 回答としてマークされていない kgg01234 2011年12月13日 12:06
    2011年12月13日 11:59
  • TH01さん、ありがとうございます。ListChangedが良さそうですね。

    このイベントもテストしていたのですが、頻繁に呼び出されて使えないと早トチリしていました。
    e.ListChangedTypeを見落としていたので、これを調べれば大丈夫ですね。
       if (e.ListChangedType == ListChangedType.ItemChanged)

     

    • 回答としてマーク kgg01234 2011年12月13日 12:04
    • 回答としてマークされていない kgg01234 2011年12月13日 12:05
    2011年12月13日 12:04