DataGridViewCombobox 列中的自动完成有啥奇怪的行为?
Posted
技术标签:
【中文标题】DataGridViewCombobox 列中的自动完成有啥奇怪的行为?【英文标题】:What a strange behavior in AutoComplete in DataGridViewCombobox column?DataGridViewCombobox 列中的自动完成有什么奇怪的行为? 【发布时间】:2012-08-31 13:38:23 【问题描述】:我正在使用 (EditingControlShowing
) 事件在 DataGridViewComboBox 列中启用自动完成功能。
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
if (e.Control is DataGridViewComboBoxEditingControl)
ComboBox combo = (ComboBox)e.Control;
((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
但它有一个奇怪的行为,当我输入一些字符然后我离开单元格(Tab 或右键)时,值没有改变。 但如果我重复这一点,价值就会改变。 从Here,您可以下载解释问题的源代码和(EXE)视频。
你能帮我让它正常工作吗?
【问题讨论】:
有趣的问题和很好的修复工作!我添加了一个替代修复,它使用的代码更少,您可能会觉得有用。 【参考方案1】:似乎对于第一个进入组合框的条目,选项卡不再触发值的提交。不知道为什么会这样,但似乎处理 CurrentCellDirtyStateChanged
并提交编辑可以修复它。
void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
// You could also check here to see if the cell in question is the combobox
if (dataGridView1.IsCurrentCellDirty)
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
【讨论】:
【参考方案2】:我是这样解决的:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
if (e.Control is DataGridViewComboBoxEditingControl)
ComboBox combo = (ComboBox)e.Control;
((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
combo.Validated -= new EventHandler(combo_Validated);
combo.Validated += new EventHandler(combo_Validated);
public static object GetPropValue(object src, string propName)
if (src == null)
return null;
return src.GetType().GetProperty(propName).GetValue(src, null);
void combo_Validated(object sender, EventArgs e)
Object selectedItem = ((ComboBox)sender).SelectedItem;
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex];
if (!String.IsNullOrEmpty(col.ValueMember))
dataGridView1.CurrentCell.Value = GetPropValue(selectedItem, col.ValueMember);
else
dataGridView1.CurrentCell.Value = selectedItem;
【讨论】:
以上是关于DataGridViewCombobox 列中的自动完成有啥奇怪的行为?的主要内容,如果未能解决你的问题,请参考以下文章
Springboot jpa:实体无法绑定不在表列中的自定义查询中的数据
vb.net 为 datagridviewcombobox 中的每个项目显示工具提示文本
在 DataGridViewComboBox 下拉列表中设置特定项目的颜色