Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Базы данных под .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 |
Максимально упрощённый тестовый пример. |