在DataGrid中编辑几乎所有内容






4.92/5 (47投票s)
2005年2月27日
4分钟阅读

361074

7347
让您的 DataGrid 能够编辑图片和各种其他数据类型。
引言
Windows Forms 中提供的 DataGrid
支持两种列类型:
DataGridTextBoxColumn
用于编辑字符串,以及DataGridBoolColumn
用于编辑布尔值。
当然,Windows Forms 库的开发人员意识到这可能不够,因此他们提供了一个基类 (DataGridColumnStyle
),可用于实现其他列类型。本文讨论了通过新增列类型来增强 DataGrid
,以允许编辑各种数据类型。这些增强功能的源代码作为 SekosPD.Windows.Forms
库的一部分被发布到公共领域。
演示应用程序
上面的屏幕截图显示了一个简单的演示应用程序,该应用程序允许输入一组科学领域的贡献者。DataSet
架构如下所示。每位贡献者都有一个照片列以及多个用于出生和死亡日期以及颜色代码的属性列。
为了使示例保持简单,数据通过将 DataSet
作为 XmlDocument
写入磁盘来持久化。在实际应用程序中,DataSet
的更改当然会持久化到数据层 - 可能是数据库,例如 Microsoft SQL Server。
新列样式
对于此演示,我们将添加以下列类型:
DataGridDataPictureColumn
用于编辑图片,以及DataGridPropertyEditorColumn
用于编辑几乎任何其他数据类型。
由于此代码源自的 AgileStudio 产品是 Visual Studio 的插件,因此它能够覆盖 ColumnStyles
的标准集合编辑器。因此,“添加”下拉菜单列出了所有可用的列样式。事实上,设计器也被覆盖,允许通过拖放将列添加到 DataGrid
。
由于本文中的演示是独立的,因此在编辑器中只会看到两个标准的列样式,您需要手动添加相应的代码。(一种方法是添加一个标准的 DataGridTextBoxColumn
,然后在代码窗口中更改其类型。完成此操作后,您将能够更改编辑器中的 Mapping
等属性。)如果您对如何避免这种情况感兴趣,请告诉我,我将在后续文章中介绍。
Friend WithEvents DataGridPropertyEditorColumn1 As _ SekosPD.Windows.Forms.DataGridPropertyEditorColumn … Me.DataGridPropertyEditorColumn1 = _ New SekosPD.Windows.Forms.DataGridPropertyEditorColumn … <System.Diagnostics.DebuggerStepThrough()> Private Sub _ InitializeComponent() … ' 'DataGridPropertyEditorColumn1 ' Me.DataGridPropertyEditorColumn1.HeaderText = "Born" Me.DataGridPropertyEditorColumn1.MappingName = "Born" Me.DataGridPropertyEditorColumn1.NullText = "" Me.DataGridPropertyEditorColumn1.PropertyType = GetType(System.DateTime) Me.DataGridPropertyEditorColumn1.UseStringAsUnderlyingType = False Me.DataGridPropertyEditorColumn1.Width = 150
编辑图片
这通过使用 DataGridDataPictureColumn
类型的列来实现。右键单击会弹出一个上下文菜单,允许通过剪贴板传输图像,或允许从文件粘贴图像。
目前,ADO.NET 仅支持一小部分数据类型。出于这个原因,图片字段被编码为 base64Binary
,这在 .NET 类型中等同于一个 `byte` 数组。内部函数 ByteArrayToImage
和 ImageToByteArray
处理所需的转换。
如果您将 Microsoft SQL Server 用作您的数据层,请确保您正确处理 base64 二进制数据。例如,如果您以 XML 格式获取数据,请使用如下语句:
SELECT ... FOR XML EXPLICIT,BINARY BASE64
编辑几乎任何其他数据类型
这通过使用 DataGirdPropertyEditorColumn
类型的列来实现。本示例中的 DataGridPropertyEditorColumns
使用了两个编辑器 - 一个用于 System.DateTime
,一个用于 System.Drawing.Color
。这两者都是由 Microsoft 实现为下拉列表。这是最常见的方法,但对于某些类型,例如 System.Drawing.Font
,编辑器被实现为弹出对话框。
真正令人高兴的是,.NET 标准库中包含了数十个 UITypeEditor
和 TypeConverter
。这些是驱动 Visual Studio 中用于编辑属性的 PropertyGrid
所必需的。您几乎不费吹灰之力就可以利用所有这些功能。只需相应地设置列中的 PropertyType
属性,其余一切都会自动完成。为自己编写的类型实现 TypeConverter
和 UITypeEditor
也相当容易。
DataGridPropertyEditorColumn
还有一个重要的属性需要提及:UseStringAsUnderlyingType
。当绑定到 DataSet
时,如果绑定的类型不是 DataSet
支持的类型之一(例如,System.DateTime
受支持,但 System.Drawing.Color
不支持),则应将其设置为 true
。如果您绑定到不具有此限制的其他数据源,您可以始终将 UseStringAsUnderlyingType
设置为 false
以实现更有效的数据传输。
关注点
DataGridDataPictureColumn
和 DataGridPropertyEditorColumn
在内部使用 DataPicture
和 PropertyEditor
来处理处于编辑模式下的单元格。这两个控件都可以独立于 DataGrid
使用,并进行标准的简单数据绑定。
SekosPD.Windows.Forms
库的源代码已发布到公共领域,可在此 处找到。此处 可找到该库源代码的参考风格文档。您可能还想阅读文章 “几乎任何内容都可以编辑 - 第一部分”,该文章除了 DataGrid
外,还介绍了其他控件。
本文随附的代码基于 AgileStudio 产品的一部分,该产品扩展了 Visual Studio。请在此 处查看免费评估版本,它会自动维护特定用户界面(适用于 Windows 或 Web 应用程序)所需的 datasets 和 SQL StoreProcs。
结论
本文中的代码目前是 VB.NET 版本。如果您想要 C# 版本,请告诉我。我还想研究一下您可以使用 UITypeEditor
(包括 CollectionEditor
)来让 DataGridPropertyEditorColumn
真正出色的各种精彩功能。如果您想要一篇关于此主题的文章,请联系我。