科技行者

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

知识库

知识库 安全导航

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

ASP.NET Datagrid创建自定义列

  • 扫一扫
    分享文章到微信

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

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

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

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
内置的 Datagrid 列

  了解问题的大概情况后,现在我们后退一步,看一下 ASP.NET 中构建的 5 种 Datagrid 列类型及其父类型 DataGridColumn。

  BoundColumn。这是文本字段的标准显示。它显示为纯文本,但是当 Datagrid 处于“编辑”模式时,它将转换为 TextBox。还可以选择格式化选项。

  HyperlinkColumn。用于显示文本数据,还代表一个 Web 地址 (URL)。URL 可以与显示文本相同,也可以不同,它们都可以单独设置。它显示为 <a href=...> 标记。

  ButtonColumn。它使用户能够按行与网格进行交互。它可以显示为超链接 LinkButton (<a href=...>) 或 Pushbutton (<input type="button">)。单击该按钮时将触发 PostBack,而在 Datagrid 上触发 ItemCommand 事件。

  EditCommandColumn。它与 ButtonColumn 类似,但是它自动创建用于编辑 Datagrid、取消或提交更改的按钮。触发 ItemCommand 事件,以及所单击按钮的特定事件:EditCommand、CancelCommand 或 UpdateCommand。

  TemplateColumn。用于完全控制显示给用户的控件,分为多种模板,例如 ItemTemplate 和 EditItemTemplate。任何 ASP.NET 或 HTML 控件或控件组都可以放置在这些模板中。

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


图 2:从 DataGridColumn 中继承的 5 种内置列

  尽管这些列类型非常有用,它们不过是了解 Datagrid 列内容的开始。

  传统方法: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

  当前编辑的项目是在触发 Datagrid 的 ItemDataBound 事件时绑定到 DropDownList 的。使用 ItemDataBound 事件时,请检查当前项目的 ListItemType,否则您可能会发现您正在使用 HeaderItem 或其他不适用的项目类型。为 EditItem 引用 DropDownList 控件。在下面的代码中,我直接使用单元格控件集进行说明(为了与后面的示例保持一致),但是,您可以采用简单的方法,直接为 DropDownList 控件指定 ID,并使用 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
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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