我在DataGridView
中有一个ComboBox列。在EditingControlShowing
上,我将事件处理程序附加到了编辑控件的Validating
事件上,该处理程序可以将新字符串添加到作为List<string>
的列的数据源中。但是,并非对当前单元格的每次更改都进行编辑控制。如果将EditMode
设置为EditOnEnter
,我认为编辑控件(ComboBox
)移到了新编辑的单元格的位置。
我尝试将事件处理程序附加到编辑控件的VisibleChanged
事件上,但是将EditMode
设置为EditOnEnter
(我希望数据网格具有该属性),由于a在以下情况下会触发DataError
事件:
这是显示的内容:
具有两个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