内置的 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> |
| 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 |
| 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 |
| 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://dev.xuezhishi.net/website/NET/2007-10-17/20787.html