Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Лишнее срабатывание ColumnChanged в DataTable


Автор: prigur 6.10.2013, 19:34
Есть на форме элемент 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 при переходе на другую строку, и как от этого избавиться?

Автор: Telepyz 7.10.2013, 07:33
Если мне не изменяет память, то при перемещении по строкам выбирается ячейка (выбирается строка, столбец), а то что выбрана вся строка это всего лишь опция ГридВью, который подкрашивает всю строку с выбранной ячейкой

Так что в принципе все верно

Автор: prigur 7.10.2013, 12:35
Когда стоим на строке (хорошо, пусть будет - на ячейке) и меняем значение, то об этом приходит сообщение. А если перемещаемся затем на следующую строку, то опять же приходит сообщение об изменении этого поля (явно лишнее), и только потом - что перешли на новую строку.

Автор: prigur 7.10.2013, 20:59
Максимально упрощённый тестовый пример.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)