DataGridView ComboBox - 允许键入值或自动完成

时间:2014-01-22 11:46:20

标签: c# datagridview autocomplete combobox optional

我正在使用C#/ VS2010开发一个WinForms应用程序。在两个地方,我需要将ComboBox绑定到数据表行项(让我们调用表'updateTable')。用户可以在此处输入任何文本。但是,为了帮助用户,ComboBox列表由不同的表填充(我们称之为'lookupTable'),其中SuggestAppend提供可能使用的值。

通过表单设计器设置以下值,我可以在一个独立的组合框中完美地工作:

  • Databindings = updateTable fieldname
  • Datasource = lookupTableBindingSource
  • DisplayMember = lookupTable fieldname
  • ValueMember =
  • AutocompleteMode = SuggestAppend
  • AutoCompleteSource = ListItems
  • AutoCompleteCustomSource =(收藏)
  • SelectedItem =(none)
  • SelectedValue =(无)

需要以类似的方式在DataGridView上的ComboBox中实现这一点,并且无法使其工作。我试过的是:

通过表单设计器设置这些属性:

  • DataPropertyName = updateTable fieldname
  • DataSource = lookupTableBindingSource
  • DisplayMember = lookupTable fieldname
  • 项目(收藏)
  • ValueMember =(none)

通过代码我还添加:

    private void identitiesDataGridView_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;
            combo.Validated -= new EventHandler(combo_Validated);
        }
    }

    void combo_Validated(object sender, EventArgs e)
    {
        Object selectedItem = ((ComboBox)sender).SelectedItem;
        DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)identitiesDataGridView.Columns[identitiesDataGridView.CurrentCell.ColumnIndex];
        if (!String.IsNullOrEmpty(col.ValueMember))
            identitiesDataGridView.CurrentCell.Value = GetPropValue(selectedItem, col.ValueMember);
        else
            identitiesDataGridView.CurrentCell.Value = selectedItem;
    }

    public static object GetPropValue(object src, string propName)
    {
       if (src == null)
           return null;
       return src.GetType().GetProperty(propName).GetValue(src, null);
    }

    private void identitiesDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (identitiesDataGridView.IsCurrentCellDirty)
        {
            identitiesDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

这是a)在启动表单时给我错误,因为在lookupTable中找不到某些updateTable值,b)在编辑时不允许我选择除lookupTable值以外的任何值。

任何想法我怎么能在数据网格中实现这种“你喜欢的类型,但这里有一些建议”的效果?

0 个答案:

没有答案