当DataGridView中的编辑控件移至另一个单元格时,如何接收事件?

时间:2019-02-28 06:55:38

标签: c# .net winforms datagridview

我在DataGridView中有一个ComboBox列。在EditingControlShowing上,我将事件处理程序附加到了编辑控件的Validating事件上,该处理程序可以将新字符串添加到作为List<string>的列的数据源中。但是,并非对当前单元格的每次更改都进行编辑控制。如果将EditMode设置为EditOnEnter,我认为编辑控件(ComboBox)移到了新编辑的单元格的位置。

我尝试将事件处理程序附加到编辑控件的VisibleChanged事件上,但是将EditMode设置为EditOnEnter(我希望数据网格具有该属性),由于a在以下情况下会触发DataError事件:

  1. 按Tab键,直到第一个单元格被聚焦;
  2. 在第一行中,使用键盘(向上/向下键)在第一列的单元格中选择一个值;
  3. 再次按Tab键以聚焦第二个单元格,在列内的ComboBox中键入一个尚不存在的值;
  4. 在离开单元格之前,按Enter键。

这是显示的内容:

screenshot

代码

Designer

具有两个ComboBox列(“ Column1”和“ Column2”)和DataGridView的{​​{1}},在设计器中将列1的值设置为“ a”,“ b”和“ c”。 EditMode = DataGridViewEditMode.EditOnEnter

隐藏代码

Column2.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox

更新

在将internal List<string> Options = new List<string>() { "d", "e", "f" }; public Form1() { InitializeComponent(); (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = Options; } private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (dataGridView1.CurrentCell == null || dataGridView1.CurrentCell.OwningColumn == null || dataGridView1.CurrentCell.OwningColumn.Name != "Column2") { return; } var combo = e.Control as DataGridViewComboBoxEditingControl; if (combo == null) { return; } var cb = combo as ComboBox; cb.DropDownStyle = ComboBoxStyle.DropDown; cb.Validating += Cb_Validating; cb.VisibleChanged += Cb_VisibleChanged; } private void Cb_VisibleChanged(object sender, EventArgs e) { var cb = sender as ComboBox; if (!cb.Visible) { cb.Validating -= Cb_Validating; } } private void Cb_Validating(object sender, CancelEventArgs e) { var cbo = sender as DataGridViewComboBoxEditingControl; string t = cbo.Text; var cboCell = (DataGridViewComboBoxCell)dataGridView1.CurrentCell; if (Options.Contains(t)) { cboCell.Value = t; return; } Options.Add(t); cboCell.Value = t; dataGridView1.NotifyCurrentCellDirty(true); } 设置为EditMode的情况下,如果我将EditOnEnter方法更改为此(但不能回答该问题),它将起作用:

Cb_Validating

0 个答案:

没有答案