2012-02-08 15 views
1

複数のテキストボックスがあるフォームとデータテーブルがあり、データテーブルはテキストボックスにバインドされており、データテーブルのRowChangedイベントを処理しています。フォームがロードされたときRowChangedイベントは二回しか呼ばれているがTextboxバインディング更新イベント

、DataTableの負荷から罰金、私はテキストボックス内のテキストを変更したときに何のイベントはありませんテキストボックスにそのデータ(つ以上のテキストボックスがあります)トリガーされた。ただし、データテーブルから直接データを表示すると、データが更新されたことが示されます。

コード:

private Clients.DataSetClients.ClientsDataTable dtClients = new DataSetClients.ClientsDataTable(); 
private Clients.DataSetClientsTableAdapters.ClientsTableAdapter taClients = new DataSetClientsTableAdapters.ClientsTableAdapter(); 

    private void ClientsEdit_Load(object sender, EventArgs e) 
    { 
     dtClients.RowChanged += new DataRowChangeEventHandler(dtClients_RowChanged); 

     taClients.FillByID(dtClients, ClientID); 

     textForename.DataBindings.Add("Text", dtClients, "Forename", true, DataSourceUpdateMode.OnPropertyChanged); 
     //....... 
     // etc 
     //....... 
     textEmail.DataBindings.Add("Text", dtClients, "Email", true, DataSourceUpdateMode.OnPropertyChanged); 
    } 

    void dtClients_RowChanged(object sender, DataRowChangeEventArgs e) 
    { 
     MessageBox.Show("dtClients_RowChanged"); 
    } 

    private void simpleButton1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(dtClients.Rows[0]["Email"].ToString()); 
    } 

答えて

1

あなたは(ETC、行と列の位置の変更を追加するための複数である)データテーブルに代えてRowChangedイベントの結合のBindingCompleteイベントをアップ配線試みることができます。

private void ClientsEdit_Load(object sender, EventArgs e) 
{ 
    // loading stuff 
    Binding ForenameBinding = new Binding("Text", dtClients, "Forename", true, DataSourceUpdateMode.OnPropertyChanged); 
    ForenameBinding.BindingComplete += Table_BindingComplete; 
    textForename.DataBindings.Add(ForenameBinding); 
    // loading stuff 
} 

void Table_BindingComplete(object sender, BindingCompleteEventArgs e) { 
    if (e.BindingCompleteContext == BindingCompleteContext.DataSourceUpdate) 
    MessageBox.Show("Source Updated!"); 
} 
このMessageBoxは、ユーザーがTextBoxのテキストを変更するたびにポップアップするので、すべてのキーストロークで発生します。これを回避するには、バインディングモードを OnValidationに変更してください。
Binding ForenameBinding = new Binding("Text", dtClients, "Forename", true, DataSourceUpdateMode.OnValidation); 
+0

私はちょうど同じことを試みたが、バインディングの.Formatイベントを使用していた。私はより適しているように.BindingCompleteを使用します。助けてくれてありがとう! – baked

0
private void button1_Click(object sender, EventArgs e) 
     { 
      List<string> names=new List<string>(){"Forename","Email","Phone"}; 
      foreach (var name in names) 
      { 
       var txt = this.Controls["text" + name] as TextBox; 
       txt.DataBindings.Add("Text", dtClients, name, true, DataSourceUpdateMode.OnPropertyChanged); 
      } 

     } 
+0

これは、すでに行っているテキストボックスにデータテーブルをバインドすることです。問題は、dataTable.RowChangedイベントが期待通りに呼び出されていないことです。 – baked

関連する問題