科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET Datagrid创建自定义列

ASP.NET Datagrid创建自定义列

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

通过添加自定义列以便为用户更准确地显示数据,同时学习如何增强Datagrid 的功能

作者:佚名 来源:Microsoft 2007年11月8日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
所有列的基础:DataGridColumn

  我们回顾一下所有内置列类型的父类型 DataGridColumn。(参见图 1。)它包含所有 Datagrid 列中常用的属性和方法。带星号的类型表示您创建自定义列类型时要使用的类型。

DataGridColumn 属性
FooterStyle (TableItemStyle)
FooterText(字符串)
HeaderImageUrl(字符串)
HeaderStyle (TableItemStyle)
HeaderText(字符串)
ItemStyle (TableItemStyle)
SortExpression(字符串)
Visible(布尔值)
DataGridColumn 方法
Initialize
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 接口的任何内容。在本文的示例中,我使用 ArrayList 和 DataView。

  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,可以直接转换传递给事件的“发送者”对象,再使用 TableCell 的 NamingContainer 属性引用当前的 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 集合中选择并放在列表中的任何项目都不匹配,则选择该选项。

  然后,需要确定所传入集合的类型。在本例中,我将处理两种情况:通过 ArrayList 传递一组字符串,或者数据表中的 DataView,它由 DataRowView 项目构成。对于字符串数据,我将输入一个新的 ListItem,并设置下拉项的值和文本。由于这两种情况是相同的,所以这里只需要文本。但是我将选择相应的项目来根据值作出选择,以便与下一个示例保持一致,下一个示例将设置一个单独的值属性。对于 DataRowView 项目,上一个示例中已指出,DataRowViewInstance("FieldName") 返回一个表示该字段中的数据的对象。可以使用同样的方法检索 DataTextField 和 DataValueFields 需要的值。

  最后,抛出一些异常以处理开发人员使用列时遇到的常见错误,例如向 DataField 属性发送无效字段名,或传入不兼容的 DataSource 类型。我已经对要弹出的异常消息进行了硬编码,但希望您在实际的应用程序中将这些消息保存到更容易配置的位置。例如,如果您希望在全球范围内使用您的应用程序,则可以保存到您的 web.config 文件或资源文件中。同样,您不一定非要再次抛出“未找到指定的 DataField”异常,因为在 Datagrid 被置于“编辑”模式之前可能已经在 ItemDataBinding 事件中捕获了该异常。

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

'首先添加一个空选项
DDL.Items.Add(New ListItem(""))
For Each DataSourceItem In DataSource
 Select Case DataSourceItem.GetType.ToString
  Case "System.String" '应用到 ArrayList 示例
   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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章