65.9K
CodeProject 正在变化。 阅读更多。
Home

在DataGrid中编辑几乎所有内容

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (47投票s)

2005年2月27日

4分钟阅读

viewsIcon

361074

downloadIcon

7347

让您的 DataGrid 能够编辑图片和各种其他数据类型。

引言

Windows Forms 中提供的 DataGrid 支持两种列类型:

  • DataGridTextBoxColumn 用于编辑字符串,以及
  • DataGridBoolColumn 用于编辑布尔值。

当然,Windows Forms 库的开发人员意识到这可能不够,因此他们提供了一个基类 (DataGridColumnStyle),可用于实现其他列类型。本文讨论了通过新增列类型来增强 DataGrid,以允许编辑各种数据类型。这些增强功能的源代码作为 SekosPD.Windows.Forms 库的一部分被发布到公共领域。

The Science Fields Sample Application

演示应用程序

上面的屏幕截图显示了一个简单的演示应用程序,该应用程序允许输入一组科学领域的贡献者。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` 数组。内部函数 ByteArrayToImageImageToByteArray 处理所需的转换。

如果您将 Microsoft SQL Server 用作您的数据层,请确保您正确处理 base64 二进制数据。例如,如果您以 XML 格式获取数据,请使用如下语句:

SELECT  ...  FOR XML EXPLICIT,BINARY BASE64

编辑几乎任何其他数据类型

这通过使用 DataGirdPropertyEditorColumn 类型的列来实现。本示例中的 DataGridPropertyEditorColumns 使用了两个编辑器 - 一个用于 System.DateTime,一个用于 System.Drawing.Color。这两者都是由 Microsoft 实现为下拉列表。这是最常见的方法,但对于某些类型,例如 System.Drawing.Font,编辑器被实现为弹出对话框。

真正令人高兴的是,.NET 标准库中包含了数十个 UITypeEditorTypeConverter。这些是驱动 Visual Studio 中用于编辑属性的 PropertyGrid 所必需的。您几乎不费吹灰之力就可以利用所有这些功能。只需相应地设置列中的 PropertyType 属性,其余一切都会自动完成。为自己编写的类型实现 TypeConverterUITypeEditor 也相当容易。

DataGridPropertyEditorColumn 还有一个重要的属性需要提及:UseStringAsUnderlyingType。当绑定到 DataSet 时,如果绑定的类型不是 DataSet 支持的类型之一(例如,System.DateTime 受支持,但 System.Drawing.Color 不支持),则应将其设置为 true。如果您绑定到不具有此限制的其他数据源,您可以始终将 UseStringAsUnderlyingType 设置为 false 以实现更有效的数据传输。

关注点

DataGridDataPictureColumnDataGridPropertyEditorColumn 在内部使用 DataPicturePropertyEditor 来处理处于编辑模式下的单元格。这两个控件都可以独立于 DataGrid 使用,并进行标准的简单数据绑定。

SekosPD.Windows.Forms 库的源代码已发布到公共领域,可在此 找到。此处 找到该库源代码的参考风格文档。您可能还想阅读文章 “几乎任何内容都可以编辑 - 第一部分”,该文章除了 DataGrid 外,还介绍了其他控件。

本文随附的代码基于 AgileStudio 产品的一部分,该产品扩展了 Visual Studio。请在此 查看免费评估版本,它会自动维护特定用户界面(适用于 Windows 或 Web 应用程序)所需的 datasets 和 SQL StoreProcs。

结论

本文中的代码目前是 VB.NET 版本。如果您想要 C# 版本,请告诉我。我还想研究一下您可以使用 UITypeEditor(包括 CollectionEditor)来让 DataGridPropertyEditorColumn 真正出色的各种精彩功能。如果您想要一篇关于此主题的文章,请联系我。

在 DataGrid 中几乎可以编辑任何内容 - CodeProject - 代码之家
© . All rights reserved.