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 下拉列表中设置特定项目的颜色

如何从数据库 vb.net 将项目添加到 datagridviewcombobox

JPA CriteriaBuilder 中的自定义表达式

将 DataGridViewComboBox 默认设置为等于现有 DataGridView 列