为 ASP.NET Datagrid 创建自定义列

 

Marcie Robillard
DatagridGirl.com

2003 年 9 月

总结: ASP.NET Datagrid 控件是 Web 开发人员可用的更强大的控件之一。 了解如何通过添加自定义列来更适合用户显示数据,使其更加强大。 (16 个打印页)

适用于:
   Microsoft® ASP.NET

下载本文的源代码

目录

简介
重用案例
DropDownList 方案
Built-In Datagrid 列
Old-Fashioned方式:TemplateColumn 中的 DropDownList
所有列的母亲:DataGridColumn
可重用方式:创建 DropDownColumn
使用 DropDownColumn
结论

简介

让我们面对现实,为 Microsoft® ASP.NET 编写 Datagrid 代码可能非常重复。 即使 痴迷于此控件,我一直在寻找快捷方式来简化这些任务。 没有人喜欢编写重复的代码,对吧? 为了帮助避免这种卑鄙的任务,目标是采用跨项目重复的代码,并将其封装到一个漂亮的、有凝聚力的包中,你可以一遍又一遍地重复使用。 这就是面向对象的编程的全部内容,使用 Datagrid 也不例外。 使用 Datagrid 控件实现此目的的一种方法是采用通常用于其中一个内置列类型的代码, (我将在第一个示例) 中执行此操作,并创建一个可在多个 Datagrid 项目中重复使用的自定义列类型。

本文将引导你完成使用标准 TemplateColumn某个 Datagrid 列内使用 DropDownList 控件的过程,然后将该逻辑转换为 Datagrid 的自定义列类型,我将称之为 DropDownColumn。 此外,还创建了一些免费可用的自定义 Datagrid 列,因此请务必在 MetaBuilders.com 检查下载内容。

重用案例

如果你的组与许多组织类似,则你已将业务逻辑和/或数据访问逻辑分离为一个单独的组件或一组组件,其余 ASP.NET 文件、ASPX 和代码隐藏包含纯呈现逻辑。 (“Purely”是一个相对术语。) 但是,即使尽可能重复使用该演示文稿级别的逻辑,这样下次用户来敲门说“嘿,我希望我的应用程序看起来就像会计中的 Susie”,你可以快速构建她的东西,重复使用会计应用程序中的一些演示元素。 或者,你可能想要打包一些逻辑,以在 Web 上销售或在网站上分发。 ASP.NET 通过创建自己的服务器控件或从现有类型派生以获取所需功能,使这一过程比以往更容易。

DropDownList 方案

假设你正在编辑本地 Microsoft SQL Server ™上的 Northwind 数据库(其他内容),并且你希望为用户提供 (让我们称他为 Ed the 履行经理,) 编辑 Orders 表的能力。 其中一个字段包含 ShipVia) (发货信息,Ed 需要修改这些信息。 在显示模式下,运输公司应显示为纯文本。 当 Ed 单击“编辑”按钮时,你希望为他提供包含不同运输公司的 DropDownList,而不是仅为他提供一个 TextBox 来编辑 (1、2 或 3) 的发货方法代码。 (埃德不记得哪个运输公司对应于哪个数字,所以这有助于他。)

Aa479316.creatingcustomcolumns_fig1 (en-us,MSDN.10) .gif

图 1. 选择运输公司

Built-In Datagrid 列

现在,我们已经回顾了问题情况,让我们退后一步,看看 ASP.NET 中内置的 Datagrid 列及其父类 DataGridColumn 的 5 个列类型。

  • BoundColumn。 这是用于文本字段的标准显示。 它呈现为纯文本,但在 Datagrid 置于编辑模式时转换为 TextBox。 某些格式设置选项也可用。
  • HyperlinkColumn。 这是用于显示文本数据,该数据也表示 web 地址 (URL) 。 URL 可能与显示文本相同,也可能不相同;两者都可以单独设置。 它呈现为 <href=...> 标记。
  • ButtonColumn。 这是为了允许用户与网格进行基于行的交互。 它可以呈现为超链接 的 LinkButton (<href=...>) ,或 按钮 (<输入 type=“button”>) 。 单击按钮时,将触发 PostBack,并在 Datagrid 上触发 ItemCommand 事件。
  • EditCommandColumn。 这类似于 ButtonColumn,但它会自动创建用于编辑 Datagrid 以及取消或提交所做的更改的按钮。 触发 ItemCommand 事件,以及单击的按钮的特定事件 、EditCommandCancelCommandUpdateCommand
  • TemplateColumn。 这是为了完全控制向用户显示的控件,分为不同的模板,如 ItemTemplateEditItemTemplate。 任何 ASP.NET 或 HTML 控件或控件集都可以放置在这些模板中。

注意 在直接使用这些列类型之前,请务必关闭“在运行时自动生成列” (AutoGenerateColumns) 。 然后,可以在属性生成器中或直接在 ASPX 文件的 HTML 代码中使用这些列类型。

Aa479316.creatingcustomcolumns_fig2 (en-us,MSDN.10) .gif

图 2. 五个内置列,继承自 DataGridColumn

与这些列类型一样有用,它们只是 Datagrid 列内可能的开始。

Old-Fashioned方式:TemplateColumn 中的 DropDownList

在深入了解创建新列类型之前,首先让我们看一下如何在不使用自定义列的情况下,直接在 TemplateColumn 中使用 DropDownList 来解决下拉问题。 ItemTemplate 将仅包含当前值的纯文本表示形式,而 EditItemTemplate 将包含将在<运行时操作的 asp:DropDownList> 控件。

<asp:DataGrid id="DataGrid1" 
   runat="server" CssClass="grid" 
   AutoGenerateColumns="False">
   <Columns>
      <asp:EditCommandColumn 
         EditText="Edit" CancelText="Cancel" 
         UpdateText="Update" />
      <asp:BoundColumn 
         DataField="OrderID" ReadOnly="True" 
         HeaderText="Order ID" />
      <asp:BoundColumn 
         DataField="ShipName" HeaderText="Ship to" 
         ReadOnly="True" />
      <asp:BoundColumn 
         DataField="ShipCountry" HeaderText="Country" 
         ReadOnly="True" />
      <asp:TemplateColumn HeaderText="Ship Method">
         <ItemTemplate>
            <%#Container.DataItem("ShipVia")%>
         </ItemTemplate>
         <EditItemTemplate>
            <asp:DropDownList runat="server" ID="Dropdownlist1"/>
         </EditItemTemplate>
      </asp:TemplateColumn>
   </Columns>
</asp:DataGrid>

用于绑定 Datagrid 的代码:

Sub BindGrid()
    Dim SQL As String = "SELECT OrderID, 
      ShipName, ShipCountry, ShipVia FROM Orders"
    Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
    Dim DS As New DataSet
    DA.Fill(DS, "Orders")
    DataGrid1.DataSource = DS.Tables("Orders").DefaultView
    DataGrid1.DataBind()
End Sub

当前正在编辑的项的 DropDownList 绑定在 DatagridItemDataBound 事件期间发生。 使用 ItemDataBound 事件时,请务必检查当前项的 ListItemType,或者可以快速找到自己使用 HeaderItem 或任何其他不适用项类型。 获取对 EditItemDropDownList 控件的引用。 在下面的代码中,我已使用单元格的控件集合直接 (来演示这一点,以便与后面的示例) 保持一致,但可以通过将 ID 分配给 DropDownList 控件并使用 Datagrid 项的 FindControl 方法查找控件引用来轻松执行此操作。 由于 Datagrid 绑定到 DataTable 的默认视图,因此该视图的每个元素的类型均为 DataRowView,并且可以将当前项的 DataItem 属性强制转换为 DataRowView 的实例。 这样,就可以按字段名称直接引用该 DataItem 中的字段。 使用此技术,在此记录上存储“ShipVia”的当前值,并使用它来选择相应的下拉项。

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) _ 
      Handles DataGrid1.ItemDataBound
    If e.Item.ItemType = ListItemType.EditItem Then
        Dim DRV As DataRowView = CType(e.Item.DataItem, DataRowView)
        Dim CurrentShip As String = DRV("ShipVia")
        Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
        Dim SQL As String = _
      "SELECT ShipperID, CompanyName FROM Shippers ORDER BY ShipperID"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        Dim item As ListItem
        DA.Fill(DS, "Shippers")
        DDL.DataSource = DS.Tables("Shippers").DefaultView
        DDL.DataTextField = "CompanyName"
        DDL.DataValueField = "ShipperID"
        DDL.DataBind()
        item = DDL.Items.FindByValue(CurrentShip)
        If Not item Is Nothing Then item.Selected = True
    End If
End Sub

最后,代码从 DropDownList 中检索当前选定的值,并将更新执行回数据库:

Private Sub DataGrid1_UpdateCommand(ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
    Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
    Dim NewShip As Integer = DDL.SelectedValue
    Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
    Dim SQL As String = _
      "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"
    Dim Conn As SqlConnection = New SqlConnection(ConnStr)
    Dim Cmd As New SqlCommand(SQL, Conn)
    Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
    Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
    Conn.Open()
    Cmd.ExecuteNonQuery()
    Conn.Close()
    DataGrid1.EditItemIndex = -1
    BindGrid()
End Sub

所有列的母亲:DataGridColumn

让我们返回并检查所有内置列类型 DataGridColumn 的父类。 (请参阅图 1.) 她包含所有 Datagrid 列中通用的属性和方法。 我在要创建的自定义列类型中将要使用的列旁边放置了一个star。

DataGridColumn 属性

  • FooterStyle (TableItemStyle)
  • FooterText (字符串)
  • HeaderImageUrl (字符串)
  • HeaderStyle (TableItemStyle)
  • HeaderText (String)
  • ItemStyle (TableItemStyle)
  • SortExpression (字符串)
  • 可见 (布尔)

DataGridColumn 方法

  • 初始化
  • InitializeCell
  • LoadViewState
  • OnColumnChanged
  • SaveViewState
  • TrackViewState

可重用方式:创建 DropDownColumn

需要做的第一件事是在 Microsoft® Visual Studio® .NET 中创建新的类库项目,并将其命名为 MyCustomColumn。 添加名为 DropDownColumn 的新类,并确保在类定义周围添加命名空间,以便初始代码如下所示:

Namespace MyCustomColumn
    Public Class DropDownColumn
        Inherits DataGridColumn

        Public DataSource As ICollection
        Public DataField As String
        Public DataTextField As String
        Public DataValueField As String

    End Class
End Namespace

我还声明了 4 个公共属性,如下所示:

  • DataSource。 这是要填充 DropDownList 的数据集。 这可以是实现 ICollection 接口的任何内容。 对于本文中所示的示例,我使用 ArrayListDataView
  • DataField。 这是父 Datagrid 数据源中的字段,将与下拉列表中选择的数据相对应。 例如,如果 DataSource 包含状态集合, 则 DataField 将是类似于“StateCode”的内容,或者使用状态在表中命名的任何字段。
  • DataTextField。 这是下拉列表中显示的文本,可能与基础值相同,也可能不相同。
  • DataValueField。 这是表示特定下拉选项的值。 DataValueField 通常是整数值或其他代码,而 DataTextField 是文本说明,这将对用户更有意义。

接下来重写 InitializeCell这是 Datagrid 列的固有事件之一。 InitializeCell 针对列中的每个表单元格发生,这与直接使用 Datagrid 时的 ItemCreated 事件非常类似。 可以在此处操作单元格内容,例如设置 HeaderText 和添加要向其添加数据的 DropDownList 控件。 我还为单元格的 DataBinding 事件添加了处理程序,根据当前是否正在编辑行,需要以不同的方式处理这些处理程序。 每个 System.Web.UI.Control 都有一个 DataBinding 事件,当数据绑定到控件(在本例中为 Datagrid 中的 TableCell 对象)时,你可以访问基础数据。

Public Overrides Sub InitializeCell(ByVal cell As TableCell, _
   ByVal columnIndex As Integer, _
   ByVal itemType As ListItemType)
       MyBase.InitializeCell(cell, columnIndex, itemType)
       Select Case itemType
              Case ListItemType.Header
                   cell.Text = HeaderText
              Case ListItemType.Item, ListItemType.AlternatingItem
                   AddHandler cell.DataBinding, AddressOf ItemDataBinding
              Case ListItemType.EditItem
                   AddHandler cell.DataBinding, AddressOf EditItemDataBinding
                   Dim DDL As New DropDownList
                   cell.Controls.Add(DDL)
            End Select
        End Sub

接下来, ItemDataBinding 例程,当 Datagrid 中的每个 Item 或 AlternatingItem 被数据绑定时触发。 在这里,需要获取对要绑定的 TableCell 的引用,这是作为传递给事件的“sender”对象的直接强制转换,并使用 TableCellNamingContainer 属性获取对当前 DataGridItem 的引用。 在此处,可以仅将 DataField 的内容显示为纯文本,就像此字段显示在 BoundColumn 中一样。 最后,如果用户指定的字段不存在,我想向用户提供更友好的错误消息;否则,他们只会收到泛型“索引已超过范围”消息。

Private Sub ItemDataBinding(ByVal sender As Object, ByVal e As EventArgs)
     Dim cell As TableCell = CType(sender, TableCell)
     Dim DGI As DataGridItem = CType(cell.NamingContainer, DataGridItem)
     Try
          cell.Text = DGI.DataItem(DataField)
     Catch RangeEx As IndexOutOfRangeException
          Throw New Exception("Specified DataField was not found.")
     Catch OtherEx As Exception
          Throw New Exception(OtherEx.InnerException.ToString)
     End Try
 End Sub
 

接下来,你将对 EditItemDataBinding 事件进行编码,当行进入编辑模式时,该事件将发生在自定义列的单元格中。 再次获取对当前单元格和在 InitializeCell 方法期间插入的 DropDownList 控件的引用。 在 DropDownList 中添加空白项作为第一个选项,如果列当前中的数据与放置在 DataSource 集合中的列表中的任何项不匹配,则会选择该选项。

然后,需要确定传入的集合 类型 。 就此示例而言,我将处理 2 个案例,一组通过 ArrayList 传入的字符串,或一个由 DataRowView 项组成的数据表中的 DataView 。 对于字符串数据,我将输入新的 ListItem 并设置下拉项的值和文本。 文本是此处真正需要的,因为两者完全相同,但我会根据值选择相应的项,以适应下一个设置单独值属性的示例。 对于 DataRowView 项,我在前面的示例中指出 ,DataRowViewInstance (“FieldName”) 返回表示该字段数据的对象。 可以使用相同的方法检索 DataTextFieldDataValueFields 所需的值。

最后,引发一些异常来处理开发人员在使用此列时可能出现的常见错误,例如在 DataField 属性中发送无效字段名称,或传入不兼容的 DataSource 类型。 我已将异常消息硬编码为向上冒泡,但希望在实际应用程序中,你可以将这些消息存储在更可配置的位置,例如存储在web.config文件中,或者存储在资源文件中(如果希望能够全球化应用程序)。 此外,你实际上不必在此处再次引发“未找到指定的 DataField”异常,因为它已在 ItemDataBinding 事件中捕获,然后再将 Datagrid 置于编辑模式。

Private Sub EditItemDataBinding(ByVal sender As Object, _
ByVal e As EventArgs)
            Dim cell As TableCell = CType(sender, TableCell)
            Dim DDL As DropDownList = _
CType(cell.Controls(0), DropDownList)
            Dim DataSourceItem As Object
            Dim item As ListItem
            Dim DGI As DataGridItem

            'Add a first, blank option
            DDL.Items.Add(New ListItem(""))
            For Each DataSourceItem In DataSource
                Select Case DataSourceItem.GetType.ToString
                    Case "System.String" 'Applies to ArrayList example
                        item = New ListItem(DataSourceItem, DataSourceItem)
                        DDL.Items.Add(item)
                    Case "System.Data.DataRowView"
                        Dim DRV As DataRowView = _
                           CType(DataSourceItem, DataRowView)
                        item = New_
              ListItem(DRV(DataTextField), DRV(DataValueField))
                        DDL.Items.Add(item)
                    Case Else
                        Throw New Exception("Invalid DataSource type.")
                End Select
            Next

            Try
                DGI = CType(cell.NamingContainer, DataGridItem)
                item = DDL.Items.FindByValue(DGI.DataItem(DataField))
            Catch RangeEx As IndexOutOfRangeException
                Throw New Exception("Specified DataField was not found.")
            Catch OtherEx As Exception
                Throw New Exception(OtherEx.InnerException.ToString)
            End Try

            If Not item Is Nothing Then item.Selected = True
End Sub

使用 DropDownColumn

现在,你已了解创建 DropDownColumn 类所需的所有代码,接下来让我们看看在应用程序中使用此控件所需的内容。 如果你正在家进行跟踪,但尚未这样做,请继续将上面创建的命名空间生成到 MyCustomColumn.dll 中,并将其复制到要在其中试用的应用程序的 /bin 文件夹中。出于我的目的,我创建了一个名为 UseCustomColumn 的新 Web 应用程序,并添加了对 /bin 目录中找到MyCustomColumn.dll的引用。 在 ASPX 文件的顶部,添加 @Register 指令:

<%@ Register TagPrefix="dgg" 
      Namespace="MyCustomColumn" 
      Assembly="MyCustomColumn" %>

请注意,新的 Datagrid 列类型不会显示在 Datagrid 的 Visual Studio .NET 属性生成器中,因此必须转到 HTML 视图并在其中添加列声明。 确保 Datagrid 声明位于一组 <形式 runat=“server”>中...</form> 标记,用于处理 PostBacks。 ASPX 文件的其余部分如下所示:

<%@ Page Language="vb" 
   AutoEventWireup="false" 
   Codebehind="WebForm1.aspx.vb" 
   Inherits="UseCustomColumn.WebForm1" 
Trace="False" Debug="True"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
   <HEAD>
      <title>WebForm1</title>
      <LINK rel="stylesheet" type="text/css" href="Styles.css">
      <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
      <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" 
         content="https://schemas.microsoft.com/intellisense/ie5">
   </HEAD>
   <body>
   <form id="Form1" method="post" runat="server">
   <asp:DataGrid id="DataGrid1" 
      runat="server" CssClass="grid" 
      AutoGenerateColumns="False">
      <Columns>
         <asp:EditCommandColumn 
            EditText="Edit" CancelText="Cancel" 
            UpdateText="Update" />
         <asp:BoundColumn 
            DataField="OrderID" 
            ReadOnly="True" 
            HeaderText="Order ID"/>
         <asp:BoundColumn 
            DataField="ShipName" 
            HeaderText="Ship to" 
            ReadOnly="True"/>
         <asp:BoundColumn 
            DataField="ShipCountry" 
            HeaderText="Country" 
            ReadOnly="True"/> 
         <dgg:DropDownColumn DataField="ShipVia" HeaderText="Ship Method" />
      </Columns>
   </asp:DataGrid>
   </form>
   </body>
</HTML>

Datagrid 绑定到 Northwind 示例中的 Orders 表,自定义 DropDownColumn 绑定到 ShipVia 列。 目前,我仅设置 DataField 属性,因为我只是绑定到简单的 ArrayList,并且不需要 DataTextFieldDataValueField 属性。 如果具有预定义的不更改数据列表,或者需要快速脏方法来设置选项,则 ArrayList 选项是最简单的。 DropDownColumnDataSource 在代码中设置,首先获取对 DropDownColumn 的引用:

Dim DDC As MyCustomColumn.DropDownColumn
DDC = CType(DataGrid1.Columns(4), MyCustomColumn.DropDownColumn)
 Dim AL As New ArrayList
 AL.Add("Shipping Company A")
 AL.Add("Shipping Company B")
 AL.Add("Shipping Company C")
 DDC.DataSource = AL

下面是运行此操作时的输出:

Aa479316.creatingcustomcolumns_fig3 (en-us,MSDN.10) .gif

图 3. 使用 ArrayList

接下来,需要转换此示例,以使用数据库中的实时表。 ShipVia 是查找表“发货人”的外键,我将将其作为 DataSource 分配给代码中的 DropDownColumn 。 还需要更改 DropDownColumn 的声明,以包含与“发货人”表中对应字段匹配的 DataTextFieldDataValueField 名称:

<dgg:DropDownColumn 
   DataField="ShipVia" 
   DataTextField="CompanyName" 
   DataValueField="ShipperID" HeaderText="Ship Method" />

然后将“订单”表绑定到 Datagrid,将“发货人”表绑定到自定义列:

     Dim SQL As String = 
     "SELECT OrderID, ShipName, ShipCountry, ShipVia FROM Orders"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        DA.Fill(DS, "Orders")
        'Dim Cmd As SqlCommand = New SqlCommand(SQL, Conn)
        'Conn.Open()
        'DataGrid1.DataSource = _
      Cmd.ExecuteReader(CommandBehavior.CloseConnection)
        DataGrid1.DataSource = DS.Tables("Orders").DefaultView
        SQL = "SELECT ShipperID, CompanyName " & _
            "FROM Shippers ORDER BY ShipperID"
        DA.SelectCommand.CommandText = SQL
        DA.Fill(DS, "Shippers")
        DDC.DataSource = DS.Tables("Shippers").DefaultView
        DataGrid1.DataBind()

使用实时数据时, DataGridColumn 会根据 Orders 表中的值 (1、2 或 3) 自动从 DropDownList 中选择适当的项,如下所示:

Aa479316.creatingcustomcolumns_fig4 (en-us,MSDN.10) .gif

图 4。 从数据库检索数据

使用 DropDownColumn 的最后一步是检索所选值以传递回数据库的更新。 为此,只需获取对单元格中的 DropDownList 控件的引用,并确定其 SelectedValue 属性:

 Private Sub DataGrid1_UpdateCommand( _
   ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
        Dim CustomDDL As DropDownList = _
CType(e.Item.Cells(4).Controls(0), DropDownList)
        Dim NewShip As Integer = CustomDDL.SelectedValue
        Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
        Dim SQL As String = _
         "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"
        Dim Conn As SqlConnection = New SqlConnection(ConnStr)
        Dim Cmd As New SqlCommand(SQL, Conn)
        Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
        Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
        Conn.Open()
        Cmd.ExecuteNonQuery()
        Conn.Close()
        DataGrid1.EditItemIndex = -1
        BindGrid()
    End Sub

结论

这总结了如何创建派生自 DataGridColumn 的新列类型,在数据绑定发生时点击数据绑定,并在实际应用程序中投入使用。 这只是可重用 Datagrid 列的一个示例,因此,我面临的挑战是检查自己的应用程序,以查看要重复哪些功能,这些功能可以整齐地包装到其自己的自定义 Datagrid 列中。 为常见使用方案(如列中的 DropDownList )或具有特定于组织的专用功能开发自己的列。 你不必通过在自定义列中包含一个 ASP.NET 控件来限制自己;可以创建更复杂的结构,例如将一系列其他控件、第三方内容或整个 Datagrid 控件嵌套在列内,以生成信息层次结构。 所以,让你的想象力疯狂运行。

这五种内置列类型非常有用,它们满足使用 Datagrid 控件时发现的大多数显示方案的需求。 但是,在不派生自己的控制权的情况下,你一直坚持以自由形式将任何花哨内容放入 TemplateColumn 中。 创建自定义列可以摆脱这些约束,并为 Datagrid 应用程序添加丰富的功能。

关于作者

Marcie “Datagrid Girl” Robillard,Microsoft MVP for ASP.NET,是一名专注于 ASP.NET 的独立顾问和培训师。 她的专长是 ASP.NET Datagrid,她致力于一个网站, DatagridGirl.com。 在网站上,你可以找到指向最佳 Datagrid 文章的链接、针对 Datagrid 内容评论的书籍,以及越来越多的 Datagrid 常见问题解答集合。 Marcie 也浪费,错误,花了很多时间审查 ASP.NET 论坛,并在任何可以找到 Datagrid 问题的地方给出答案。 Marcie 目前的项目涉及指导公司发展其 .NET 技能。 有关组织内部的专业咨询或培训,请联系 Marcie@DatagridGirl.com

引用:

MetaBuilders.com。 免费自定义 Datagrid 列,包括源代码 (C#) 。

DatagridGirl.com。 Datagrid 所有内容的资源。

ASP.NET Data Web Controls by Scott Mitchell, SAMS, 2003, ISBN 0672325012

© Microsoft Corporation. 保留所有权利。