科技行者

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

知识库

知识库 安全导航

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

ASP.NET Datagrid创建自定义列

  • 扫一扫
    分享文章到微信

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

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

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

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
使用 DropDownColumn

  以上是创建 DropDownColumn 类所需的所有代码,下面我们看一看如何在应用程序中使用该控件。如果您是在家中学习,而且还没有开始做,请将上面创建的命名空间编译到 MyCustomColumn.dll 中,并将其复制到您想试验的应用程序的 /bin 文件夹中。本例中,我创建一个新的 Web 应用程序 UseCustomColumn,并在我的 /bin 目录的 MyCustomColumn.dll 中添加一个引用。在 ASPX 文件的顶部,添加 @Register 指令:

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

  请注意,新的 Datagrid 列类型不会为 Datagrid 出现在 Visual Studio .NET 属性生成器中,因此您需要进入 HTML 视图并在其中添加列声明。确保 Datagrid 声明位于一组 <form runat="server">...</form> 标记之中,这些标记用于处理 PostBack。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="http://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,不需要 DataTextField 和 DataValueField 属性。如果您有预定义的常数列表或者您需要一个快速设置选项的方法,ArrayList 选项最简单。DropDownColumn 的 DataSource 在代码中设置,首先引用 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

  下面是运行此代码的结果:


图 3:使用 ArrayList

  接下来,我需要转换该示例以便使用数据库中的活动表。ShipVia 是查找表 Shippers 的外键,我在代码中将其指定为 DropDownColumn 的 DataSource。我还需要改变 DropDownColumn 声明,以包括与 Shippers 表中的相应字段匹配的 DataTextField 和 DataValueField 名称:

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

  然后将两个 Orders 表绑定到 Datagrid,将 Shippers 表绑定到自定义列:

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)自动选择正确的项目,如下所示:


图 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 控件嵌套到列中,以表现多层信息。总之,您可以充分发挥您的想象力。

  5个内置的列类型非常有用,它们可以满足使用 Datagrid 控件进行显示的大多数情况下的需要。现在并没有开发您自己的控件,只是将一些有意义的内容随便放到 TemplateColumn 中。创建自定义列使您可以突破这些限制,在您的 Datagrid 应用程序中添加丰富的功能。

查看本文来源

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

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

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