我正在使用C#/ VS2010开发一个WinForms应用程序。在两个地方,我需要将ComboBox绑定到数据表行项(让我们调用表'updateTable')。用户可以在此处输入任何文本。但是,为了帮助用户,ComboBox列表由不同的表填充(我们称之为'lookupTable'),其中SuggestAppend提供可能使用的值。
通过表单设计器设置以下值,我可以在一个独立的组合框中完美地工作:
我还需要以类似的方式在DataGridView上的ComboBox中实现这一点,并且无法使其工作。我试过的是:
通过表单设计器设置这些属性:
通过代码我还添加:
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值以外的任何值。
任何想法我怎么能在数据网格中实现这种“你喜欢的类型,但这里有一些建议”的效果?