如何使用自定义控件编辑DataGridView中单元格的内容

时间:2011-11-30 08:34:26

标签: vb.net winforms datagridview

我正在尝试在datagridview单元格中显示自定义控件,以便显示格式正确的信息。

我很熟悉使用datagridview控件接受对象列表作为其数据源。我也很乐意在cellformatting事件中填充单元格内容。

所以我打算在datagridview单元格中使用普通的文本框控件,按钮控件和链接文本控件,显示我自己的自定义控件,这对于显示一些自定义数据,如姓名,地址,电话,照片和其他。这对我的应用程序来说是一个很好的改进。

我很欣赏其他方法的一些建议。

2 个答案:

答案 0 :(得分:5)

您需要从DataGridControl继承并覆盖它生成的一些方法和属性。网上有几篇好文章供你参考,包括:

How to: Host Controls in Windows Forms DataGridView Cells

Custom DataGridViewColumn & IDataGridViewEditingControl classes

答案 1 :(得分:3)

有几个步骤可以将自定义用户控件巧妙地嵌入到DataGridView中,作为该网格中单元格使用的编辑控件。

首先,您需要编写一个继承自您的自定义控件的类来实现IDataGridViewEditingControl。这为您提供了一个封装自定义控件的DataGridViewEditingControl类。将其称为 CustomDataGridViewEditingControl

您需要完成此接口的一些关键方法; * EditingControlFormattingValue,它需要返回代表你值的东西。 * EditingControlWantsInputKey,它将控制您想要或不允许的特殊击键

一旦你有了这个 CustomDataGridViewEditingControl ,封装你的自定义控件,你需要创建另一个继承自DataGridViewTextBoxCell的类。称之为 CustomDataGridViewCell

这是表示包含自定义控件的单元格的类。将模块级变量设置为 CustomDataGridViewEditingControl

的实例
private MyCustomGridViewEditingControl _editControl;

然后,覆盖:

InitializeEditingControl - 设置自定义控件所需的任何默认值。您通常需要先调用base.initialiseEditingControl,然后传入被重写方法接收的参数。

ValueType - 返回自定义控件所代表的数据类型,例如return typeof(DateTime)

EditType - 返回编辑控件的类型,例如return typeof(MyCustomControl)

DefaultNewRowValue 如果每次DataGridView请求(插入)新的编辑行时都需要为编辑控件提供默认值

Next 您需要使用此重写的DataGridViewCell( CustomDataGridViewCell )类作为您正在使用的列的CellTemplate属性。我已经实现了自定义DataGridViewColumns来控制它,但这可能比你想要/需要的更进一步。 (如果您打算在许多网格中使用自定义控件,那么您可以这样做。)

为此,创建一个继承自DataGridViewTextBoxColumn的类,并将其CellTemplate属性设置为 CustomDataGridViewCell 的实例

令人困惑,因为很多术语和类都有相似的名字 - 希望这有帮助。

总结: 1)创建 CustomDataGridViewEditingControl - 继承自您的自定义用户控件但实现IDataGridViewEditingControl

2)创建 CustomDataGridViewCell - 它使用 CustomDataGridViewEditingControl (步骤1)作为其编辑控件。

3)使用 CustomDataGridViewCell (步骤2)作为DataGridViewColumn的CellTemplate

希望足够清楚......