我希望 DataGridView
的列使用 ComboBoxStyle.DropDown
样式的ComboBox,用户可以在下拉列表中选择其中一个条目,也可以键入任意文本 .
目前,我正在使用this answer中的代码,我可以自由地键入ComboBox的文本框部分,但是如果我键入的东西不会被提交回数据源并且该字段将恢复为原始选择 . 此外,如果我以编程方式将文本设置为不在下拉列表中的内容,我会收到 DataError
事件"DataGridViewComboBoxCell value is not valid."
我正在使用数据绑定; DataGridView
本身绑定到 BindingList<T>
.
与this question不同,我不希望将自由文本添加到下拉列表中 .
要清楚,列数据类型是 string
,我不希望它根据ComboBox的下拉列表(或其他任何内容)进行验证 .
(我是否必须按照How to: Host Controls in Windows Forms DataGridView Cells中的描述创建我自己的自定义 DataGridViewColumn
后代?)
2 回答
我找到了一个简单的,如果冗长的答案 . (但我仍然想知道是否有一种方法可以使用标准的
DataGridViewComboBoxColumn
类型 . )我按照How to: Host Controls in Windows Forms DataGridView Cells中的方法进行操作 . 我的完整解决方案太长了,无法在此发布,但我可以总结这些更改,使其使用
ComboBox
而不是示例的DateTimePicker
控件 .分别重命名三个类
DropDownComboBoxColumn
,DropDownComboBoxCell
和DropDownComboBoxEditingControl
.用
string
替换DateTime
到处 .将属性
public ComboBoxStyle DropDownStyle { get; set; }
添加到DropDownComboBoxColumn
以允许调用代码设置下拉样式 .从
DropDownComboBoxCell
构造函数中删除代码 .从
DropDownComboBoxEditingControl
构造函数中删除代码 .使
DropDownComboBoxEditingControl
派生自ComboBox
而不是DateTimePicker
.将
OnValueChanged
替换为OnTextChanged
以说明ComboBox
与DateTimePicker
中的不同命名 .使
EditingControlFormattedValue
属性获取并设置继承的Text
属性(而不是Value
),并且不需要解析 .使
ApplyCellStyleToEditingControl
设置ForeColor
和BackColor
而不是CalendarForeColor
和CalendarMonthBackground
.使
EditingControlWantsInputKey
也声明F4,因此它可用于打开和关闭下拉列表 .将以下代码添加到
PrepareEditingControlForEdit
:处理
DataGridView
的EditingControlShowing
事件,如OhBeWise's回答相关问题以设置下拉项目,如果需要,还可以自动完成模式:如果你想为所有行提供相同的下拉项,那么你总是可以将它作为
DropDownComboBoxColumn
的属性,如DropDownStyle
并在PrepareEditingControlForEdit
中设置它以避免必须处理EditingControlShowing
.为此,您可以通过下面提到的后端代码在数据网格视图中添加列:
请尝试它可能会解决您的问题 .