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>
?。糰sp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" />
?。糰sp:BoundColumn DataField="OrderID" ReadOnly="True" HeaderText="Order ID" />
?。糰sp:BoundColumn DataField="ShipName" HeaderText="Ship to" ReadOnly="True" />
?。糰sp:BoundColumn DataField="ShipCountry" HeaderText="Country" ReadOnly="True" />
?。糰sp:TemplateColumn HeaderText="Ship Method">
?。糏temTemplate>
?。?#Container.DataItem("ShipVia")%>
?。?ItemTemplate>
?。糆ditItemTemplate>
?。糰sp: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.kjueaiud.com