ASP.NET Datagrid创建自定义列(2)

发表于:2007-06-30来源:作者:点击数: 标签:
内置的 DataGrid 列 了解问题的大概情况后,现在我们后退一步,看一下 ASP.net 中构建的 5 种 Datagrid 列类型及其父类型 DataGridColumn。 BoundColumn。这是文本字段的标准显示。它显示为纯文本,但是当 Datagrid 处于“编辑”模式时,它将转换为 TextBox
     内置的 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
  
  

原文转自:http://www.ltesting.net