简体   繁体   English

DataGridViewCombobox列中的AutoComplete有什么奇怪的行为?

[英]What a strange behavior in AutoComplete in DataGridViewCombobox column?

I am using the ( EditingControlShowing ) event to Enable AutoComplete in DataGridViewComboBox Column. 我正在使用( 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;
    }
}

But it has a strange behavior, when I type some characters then I leave the cell (Tab or right key), the value did not change. 但它有一个奇怪的行为,当我键入一些字符然后我离开单元格(Tab或右键),值没有改变。
But if I repeat that, the value will change. 但如果我重复一遍,那么价值就会改变。 From Here , you can download the source code and (EXE) video that explains the problem. 这里 ,您可以下载解释问题的源代码和(EXE)视频。

Could you please help me to make it work correctly? 你能帮助我让它正常工作吗?

It appears that for that first entry into the combobox the tab no longer triggers the commit of the value. 看来,对于第一次进入组合框,选项卡不再触发值的提交。 No idea why this is so, but it appears that handling CurrentCellDirtyStateChanged and committing the edit fixes it. 不知道为什么会这样,但似乎处理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);
    }
}

I solved it like this : 我这样解决了:

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;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM