Событие обновления привязки текстового поля - PullRequest
1 голос
/ 08 февраля 2012

У меня есть форма с несколькими текстовыми полями и таблицей данных, таблица данных привязана к текстовым полям, и я обрабатываю событие 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());
    }

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вы можете попробовать связать событие BindingComplete привязки вместо события RowChanged в DataTable (это больше для добавления строк и изменения положения строк и т. Д.).

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 голосов
/ 08 февраля 2012
  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);
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...