簡體   English   中英

文本框綁定更新事件

[英]Textbox Binding Update Event

我有一個帶有多個文本框和一個數據表的表單,該數據表已綁定到文本框,並且正在處理該數據表的RowChanged事件。

但是,在加載表單( 有兩個以上的文本框 )時,僅會兩次調用RowChanged事件,數據表中的數據會很好地加載到文本框中,但是當我更改文本框中的文本時,不會觸發任何事件。 但是直接從數據表中顯示數據表明數據已更新。

碼:

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());
    }

您可以嘗試連接綁定的BindingComplete事件,而不是連接DataTable上的RowChanged事件(更多用於添加行和行位置更改等)。

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!");
}

每當用戶更改TextBox中的文本時,都會彈出該MessageBox,因此它將在每次擊鍵時觸發。 為了避免這種情況,請將綁定模式更改為OnValidation

  Binding ForenameBinding = new Binding("Text", dtClients, "Forename", true, DataSourceUpdateMode.OnValidation);
  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);
            }

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM