Лишнее сообщение ColumnChanged при переходе на другую строку (DataTable в C#)
От: Garris  
Дата: 05.10.13 12:00
Оценка:
Есть на форме элемент DevExpress.XtraTreeList.TreeList (или System.Windows.Forms.DataGridView).
Заполняем таблицу тестовыми данными:
DataTable TableTree = new DataTable();
TableTree.Columns.Add("ID", typeof (int));
TableTree.Columns.Add("Name", typeof(string));
TableTree.Columns.Add("ParentID", typeof(int));
TableTree.Columns.Add("Value", typeof(string));
TableTree.PrimaryKey = new DataColumn[]{TableTree.Columns[0]};

DataRow row_ = TableTree.NewRow();
row_.BeginEdit();
row_["ID"] = 0;
row_["ParentID"] = DBNull.Value;
row_["Name"] = "Ветвь 1";
row_["Value"] = "";
row_.EndEdit();
TableTree.Rows.Add(row_);

row_ = TableTree.NewRow();
row_.BeginEdit();
row_["ID"] = 1;
row_["ParentID"] = 0;
row_["Name"] = "Ветвь 2";
row_["Value"] = "";
row_.EndEdit();
TableTree.Rows.Add(row_);

row_ = TableTree.NewRow();
row_.BeginEdit();
row_["ID"] = 2;
row_["ParentID"] = DBNull.Value;
row_["Name"] = "Ветвь 3";
row_["Value"] = "";
row_.EndEdit();
TableTree.Rows.Add(row_);

Связываем элемент с таблицей и делаем начальные установки:
— в случае TreeList:
treeListTest.RootValue = DBNull.Value;
treeListTest.DataSource = TableTree;
treeListTest.ExpandAll();
— в случае DataGridView:
dataGridView1.DataSource = TableTree;

Связываем поле какого-нибудь текстового элемента со столбцом "Value" таблицы:
textBox1.DataBindings.Add("Text", TableTree, "Value", true, DataSourceUpdateMode.OnPropertyChanged);

Устанавливаем обрабочики для таблицы:
TableTree.ColumnChanged += new DataColumnChangeEventHandler(HandleColumnChangeEventTableTreeData);
BindingContext[TableTree].PositionChanged += new EventHandler(TableTree_PositionChanged);

void HandleColumnChangeEventTableTreeData(object sender, DataColumnChangeEventArgs e)
{
}

void TableTree_PositionChanged(object sender, EventArgs e)
{
}

В элементе DataGridView или TreeList встаём, например, на вторую строку, и меняем значение в текстовом поле, в результате срабатывает ColumnChanged и попадаем в HandleColumnChangeEventTableTreeData, — всё правильно.
Но если теперь просто переместимся на третью строку, то почему-то опять срабатывает ColumnChanged и вновь попадаем в HandleColumnChangeEventTableTreeData, и лишь только потом в TableTree_PositionChanged (срабатывает PositionChanged).
Чем вызвано повторное лишнее срабатывание ColumnChanged при переходе на другую строку, и как от этого избавиться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.