我想要一个列DataGridView
使用一个ComboBoxStyle.DropDown
样式组合框,用户可以在其中选择下拉列表中的条目之一,或键入任意文本。
目前,我正在使用来自这个答案 https://stackoverflow.com/a/30080684/我可以在组合框的文本框部分中自由键入内容,但如果我键入的内容不在下拉列表中,则它不会提交回数据源,并且字段将恢复为原始选择。此外,如果我以编程方式将文本设置为不在下拉列表中的内容,我会得到一个DataError
事件“DataGridViewComboBoxCell 值无效。”
我正在使用数据绑定;这DataGridView
本身绑定到一个BindingList<T>
.
Unlike 这个问题 https://stackoverflow.com/questions/36679164/我不希望将自由文本添加到下拉列表中。
需要明确的是,列数据类型是string
我不希望它针对 ComboBox 的下拉列表(或与此相关的任何其他内容)进行验证。
(我必须创建自己的自定义DataGridViewColumn
后代,如所描述的如何:在 Windows 窗体 DataGridView 单元格中承载控件 https://msdn.microsoft.com/en-us/library/7tas5c80(v=vs.110).aspx?)
我找到了一个简单但冗长的答案。 (但我仍然想知道是否有办法用标准来做到这一点DataGridViewComboBoxColumn
type.)
我按照中的方法如何:在 Windows 窗体 DataGridView 单元格中承载控件 https://msdn.microsoft.com/en-us/library/7tas5c80(v=vs.110).aspx。我的完整解决方案太长,无法在此处发布,但我可以总结更改以使其使用ComboBox
而不是示例的DateTimePicker
控制。
重命名三个类DropDownComboBoxColumn
, DropDownComboBoxCell
, and DropDownComboBoxEditingControl
分别。
Replace DateTime
到处都有string
.
添加属性public ComboBoxStyle DropDownStyle { get; set; }
to DropDownComboBoxColumn
允许调用代码设置下拉样式。
从中删除代码DropDownComboBoxCell
构造函数。
从中删除代码DropDownComboBoxEditingControl
构造函数。
Make DropDownComboBoxEditingControl
从获得ComboBox
代替DateTimePicker
.
Replace OnValueChanged
with OnTextChanged
考虑到不同的命名ComboBox
versus DateTimePicker
.
使EditingControlFormattedValue
继承的属性获取和设置Text
财产(而不是Value
)并且不需要解析。
Make ApplyCellStyleToEditingControl
set ForeColor
and BackColor
代替CalendarForeColor
and CalendarMonthBackground
.
Make EditingControlWantsInputKey
还声明 F4,因此可用于打开和关闭下拉菜单。
-
添加以下代码到PrepareEditingControlForEdit
:
DropDownComboBoxColumn col = _dataGridView.Columns[_dataGridView.CurrentCell.ColumnIndex] as DropDownComboBoxColumn;
if (col == null)
{
throw new InvalidCastException("Must be in a DropDownComboBoxColumn");
}
DropDownStyle = col.DropDownStyle;
// (If you don't explicitly set the Text then the current value is
// always replaced with one from the drop-down list when edit begins.)
Text = _dataGridView.CurrentCell.Value as string;
SelectAll();
处理DataGridView
's EditingControlShowing
事件如哦明智的 https://stackoverflow.com/a/30080684回答相关问题以设置下拉项,如果需要,还可以设置自动完成模式:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox box = e.Control as ComboBox;
if (box != null)
{
box.AutoCompleteSource = AutoCompleteSource.ListItems;
box.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
box.DataSource = _dropDownItems;
}
}
如果您希望所有行都有相同的下拉项,那么您始终可以将此属性设为DropDownComboBoxColumn
like DropDownStyle
并将其设置为PrepareEditingControlForEdit
以避免不得不处理EditingControlShowing
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)