DatagridGirl.com
2003 年 9 月
摘要: ASP.NET Datagrid 是 Web 開發(fā)人員可以使用的一個(gè)功能強(qiáng)大的控件。通過添加自定義列以便為用戶更準(zhǔn)確地顯示數(shù)據(jù),來學(xué)習(xí)如何增強(qiáng)該控件的功能。(本文包含一些指向英文站點(diǎn)的鏈接。)
適用于:
Microsoft? ASP.NET
下載本文的源代碼 。(請(qǐng)注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)
目錄
簡(jiǎn)介
重復(fù)使用的情況
DropDownList 方案
內(nèi)置的 Datagrid 列
傳統(tǒng)方法:TemplateColumn 中的 DropDownList
所有列的基礎(chǔ):DataGridColumn
可以重復(fù)使用的方法:創(chuàng)建 DropDownColumn
使用 DropDownColumn
小結(jié)
簡(jiǎn)介
不得不承認(rèn),為 Microsoft? ASP.NET 編寫 Datagrid 代碼包括大量的重復(fù)工作。盡管我深受該控件的困擾,但我還是不斷尋找簡(jiǎn)化這類任務(wù)的捷徑。誰都不愿意做重復(fù)的工作,對(duì)不對(duì)?為了擺脫這種煩人的工作,我們要將多個(gè)項(xiàng)目中的重復(fù)代碼封裝到一個(gè)可重復(fù)使用的程序包中。這才是面向?qū)ο蟮木幊坦ぷ魉鉀Q的問題,使用 Datagrid 也不例外。對(duì)于 Datagrid 控件來說,要實(shí)現(xiàn)該目的,需要將常用的代碼放到一個(gè)內(nèi)置的列類型中(將在第一個(gè)示例中使用),然后創(chuàng)建一個(gè)可以在多個(gè) Datagrid 對(duì)象中重復(fù)使用的自定義列類型。
本文介紹使用標(biāo)準(zhǔn) TemplateColumn 在一個(gè) Datagrid 列中使用 DropDownList 控件的過程,然后將該邏輯轉(zhuǎn)換為您的自定義 Datagrid 列類型,我稱其為 DropDownColumn 。已經(jīng)為您創(chuàng)建了一些免費(fèi)的 Datagrid 列,您可以到 MetaBuilders.com 下載所需的類型。
重復(fù)使用的情況
如果您的小組與許多組織一樣,已經(jīng)將業(yè)務(wù)邏輯和/或數(shù)據(jù)訪問邏輯分成單獨(dú)的組件或組件集,而剩下的 ASP.NET 文件、ASPX 及其代碼只包含純粹的表示邏輯。(“純粹”是一個(gè)相對(duì)的詞語。)但是,即使是表示層的邏輯有時(shí)也會(huì)重復(fù)使用,這樣,下次某個(gè)用戶來到您門前說,“我想讓我的應(yīng)用程序在‘財(cái)務(wù)’方面看起來與蘇茜的一樣”時(shí),您可以重復(fù)使用“財(cái)務(wù)”應(yīng)用程序的部分表示內(nèi)容快速為其構(gòu)建一個(gè)這樣的應(yīng)用程序。您可能還想將一些邏輯打包,在 Web 上銷售或在您的 Web 站點(diǎn)分發(fā)。ASP.NET 使這一切比以往更容易實(shí)現(xiàn),因?yàn)樗鼓梢詣?chuàng)建自己的服務(wù)器控件,或從現(xiàn)有的類型導(dǎo)出列類型,從而獲得所需的功能。
DropDownList 方案
假設(shè)您正在本地 Microsoft SQL Server? 中編輯 Northwind 數(shù)據(jù)庫(或做其他工作),您想使您的用戶(我們稱之為 Ed,倉庫保管員)可以編輯 Orders 表。其中一個(gè)字段包含運(yùn)輸信息 (ShipVia),Ed 要能夠修改該字段的信息。在顯示模式下,運(yùn)輸公司應(yīng)顯示為純文本。當(dāng) Ed 單擊 Edit(編輯)按鈕時(shí),您不光要為他提供一個(gè) TextBox 以編輯運(yùn)輸方式代碼(1、2 或 3),還要為他提供一個(gè)包含可以選擇不同運(yùn)輸公司的 DropDownList 。(因?yàn)?Ed 記不住哪個(gè)運(yùn)輸公司對(duì)應(yīng)哪個(gè)號(hào)碼,所以,DropDownList 方案可以幫助他解決這個(gè)問題。)
圖 1:選擇運(yùn)輸公司
內(nèi)置的 Datagrid 列
了解問題的大概情況后,現(xiàn)在我們后退一步,看一下 ASP.NET 中構(gòu)建的 5 種 Datagrid 列類型及其父類型 DataGridColumn 。
- BoundColumn 。這是文本字段的標(biāo)準(zhǔn)顯示。它顯示為純文本,但是當(dāng) Datagrid 處于“編輯”模式時(shí),它將轉(zhuǎn)換為 TextBox 。還可以選擇格式化選項(xiàng)。
- HyperlinkColumn 。用于顯示文本數(shù)據(jù),還代表一個(gè) Web 地址 (URL)。URL 可以與顯示文本相同,也可以不同,它們都可以單獨(dú)設(shè)置。它顯示為 <a href=...> 標(biāo)記。
- ButtonColumn 。它使用戶能夠按行與網(wǎng)格進(jìn)行交互。它可以顯示為超鏈接 LinkButton (<a href=...>) 或 Pushbutton (<input type="button">)。單擊該按鈕時(shí)將觸發(fā) PostBack,而在 Datagrid 上觸發(fā) ItemCommand 事件。
- EditCommandColumn 。它與 ButtonColumn 類似,但是它自動(dòng)創(chuàng)建用于編輯 Datagrid 、取消或提交更改的按鈕。觸發(fā) ItemCommand 事件,以及所單擊按鈕的特定事件: EditCommand 、 CancelCommand 或 UpdateCommand 。
- TemplateColumn 。用于完全控制顯示給用戶的控件,分為多種模板,例如 ItemTemplate 和 EditItemTemplate 。任何 ASP.NET 或 HTML 控件或控件組都可以放置在這些模板中。
注意: 直接使用這些列類型之前,請(qǐng)關(guān)閉 AutoGenerateColumns(運(yùn)行時(shí)自動(dòng)生成列)。然后,您可以在屬性生成器中使用這些列類型,或者直接在 ASPX 文件的 HTML 代碼中使用。
圖 2:從 DataGridColumn 中繼承的 5 種內(nèi)置列
盡管這些列類型非常有用,它們不過是了解 Datagrid 列內(nèi)容的開始。
傳統(tǒng)方法:TemplateColumn 中的 DropDownList
在研究如何創(chuàng)建新列類型之前,首先讓我們看一下如何通過直接在 TemplateColumn 內(nèi)使用 DropDownList 解決下拉列表的問題,而不用自定義列。 ItemTemplate 將只包含表示當(dāng)前值的純文本表示,而 EditItemTemplate 包含一個(gè)需要在運(yùn)行時(shí)管理的 <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
當(dāng)前編輯的項(xiàng)目是在觸發(fā) Datagrid 的 ItemDataBound 事件時(shí)綁定到 DropDownList 的。使用 ItemDataBound 事件時(shí),請(qǐng)檢查當(dāng)前項(xiàng)目的 ListItemType ,否則您可能會(huì)發(fā)現(xiàn)您正在使用 HeaderItem 或其他不適用的項(xiàng)目類型。為 EditItem 引用 DropDownList 控件。在下面的代碼中,我直接使用單元格控件集進(jìn)行說明(為了與后面的示例保持一致),但是,您可以采用簡(jiǎn)單的方法,直接為 DropDownList 控件指定 ID,并使用 Datagrid 項(xiàng)目的 FindControl 方法定位控件引用。由于 Datagrid 被綁定到 DataTable 的默認(rèn)視圖,而該視圖的元素屬于 DataRowView 類型,所以您可以將當(dāng)前項(xiàng)目的 DataItem 屬性轉(zhuǎn)換為一個(gè) DataRowView 實(shí)例。這樣,您可以按字段名直接引用 DataItem 中的字段。使用這種方法,將“ShipVia”的當(dāng)前值保存到該記錄中,并使用它選擇相應(yīng)的下拉列表項(xiàng)。
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 中檢索當(dāng)前選定值的代碼,并執(zhí)行數(shù)據(jù)庫更新:
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
所有列的基礎(chǔ):DataGridColumn
我們回顧一下所有內(nèi)置列類型的父類型 DataGridColumn 。(參見圖 1。)它包含所有 Datagrid 列中常用的屬性和方法。帶星號(hào)的類型表示您創(chuàng)建自定義列類型時(shí)要使用的類型。
DataGridColumn 屬性
- FooterStyle ( TableItemStyle )
- FooterText (字符串)
- HeaderImageUrl (字符串)
- HeaderStyle ( TableItemStyle )
- HeaderText (字符串)
- ItemStyle ( TableItemStyle )
- SortExpression (字符串)
- Visible (布爾值)
DataGridColumn 方法
- Initialize
- InitializeCell
- LoadViewState
- OnColumnChanged
- SaveViewState
- TrackViewState
可重復(fù)使用的方法:創(chuàng)建 DropDownColumn
首先要在 Microsoft? Visual Studio? .NET 中創(chuàng)建一個(gè)新類庫,并將其命名為 MyCustomColumn。添加一個(gè)新類 DropDownColumn ,并確保在您的類定義中添加命名空間,這樣您的初始代碼應(yīng)如下所示:
Namespace MyCustomColumn Public Class DropDownColumn Inherits DataGridColumn Public DataSource As ICollection Public DataField As String Public DataTextField As String Public DataValueField As String End Class End Namespace
我還聲明了 4 個(gè)公共屬性,如下所示:
- DataSource 。它是用來填充 DropDownList 的數(shù)據(jù)集。可以是實(shí)現(xiàn) ICollection 接口的任何內(nèi)容。在本文的示例中,我使用 ArrayList 和 DataView 。
- DataField 。它是父 Datagrid 數(shù)據(jù)源中的字段,它與從下拉列表中選定的數(shù)據(jù)相對(duì)應(yīng)。例如,如果 DataSource 包含一個(gè)狀態(tài)集, DataField 將類似于“StateCode”,也可以在表格中使用狀態(tài)隨意命名字段。
- DataTextField 。這是要顯示在下拉列表中的文本,可以是下面的值,也可以不是。
- DataValueField 。這是表示特殊下拉選項(xiàng)的值。 DataValueField 通常是一個(gè)整數(shù)值或其他代碼,而 DataTextField 是對(duì)用戶來說更有意義的文本說明。
接下來,覆蓋 InitializeCell ,它是 Datagrid 列的一個(gè)固有事件。列中的所有單元格都將發(fā)生 InitializeCell ,它與直接使用 Datagrid 時(shí)的 ItemCreated 事件非常相似。您可以使用它來管理單元格內(nèi)容,例如設(shè)置 HeaderText ,添加您將向其中添加數(shù)據(jù)的 DropDownList 控件。我已經(jīng)為單元格的 DataBinding 事件添加了處理程序,需要根據(jù)當(dāng)前是否正在編輯行來采取不同的處理方式。每個(gè) System.Web.UI.Control 都有一個(gè) DataBinding 事件,當(dāng)數(shù)據(jù)被綁定到控件時(shí),您可以從這里訪問底層的數(shù)據(jù),本例中為 Datagrid 中的 TableCell 對(duì)象。
Public Overrides Sub InitializeCell(ByVal cell As TableCell, _ ByVal columnIndex As Integer, _ ByVal itemType As ListItemType) MyBase.InitializeCell(cell, columnIndex, itemType) Select Case itemType Case ListItemType.Header cell.Text = HeaderText Case ListItemType.Item, ListItemType.AlternatingItem AddHandler cell.DataBinding, AddressOf ItemDataBinding Case ListItemType.EditItem AddHandler cell.DataBinding, AddressOf EditItemDataBinding Dim DDL As New DropDownList cell.Controls.Add(DDL) End Select End Sub
接下來是 ItemDataBinding 例程,當(dāng)對(duì) Datagrid 中的 Item 或 AlternatingItem 進(jìn)行數(shù)據(jù)時(shí),將觸發(fā)該例程。您需要引用回正在綁定的 TableCell ,可以直接轉(zhuǎn)換傳遞給事件的“發(fā)送者”對(duì)象,再使用 TableCell 的 NamingContainer 屬性引用當(dāng)前的 DataGridItem 。這里只能以純文本格式顯示 DataField 的內(nèi)容,就象顯示在 BoundColumn 中一樣。最后,如果用戶指定的字段不存在,我將為用戶顯示更友好的錯(cuò)誤信息,而不是僅僅顯示“索引超出范圍”這樣的一般信息。
Private Sub ItemDataBinding(ByVal sender As Object, ByVal e As EventArgs) Dim cell As TableCell = CType(sender, TableCell) Dim DGI As DataGridItem = CType(cell.NamingContainer, DataGridItem) Try cell.Text = DGI.DataItem(DataField) Catch RangeEx As IndexOutOfRangeException Throw New Exception("Specified DataField was not found.") Catch OtherEx As Exception Throw New Exception(OtherEx.InnerException.ToString) End Try End Sub
下一步,編寫 EditItemDataBinding 事件的代碼,當(dāng)某個(gè)行進(jìn)入“編輯”模式時(shí),將在我們的自定義列單元格上觸發(fā)該事件。再次引用當(dāng)前單元格并在調(diào)用 InitializeCell 方法時(shí)插入 DropDownList 控件。在 DropDownList 中添加一個(gè)空項(xiàng)目作為第一個(gè)選項(xiàng),如果列中的當(dāng)前數(shù)據(jù)與您從 DataSource 集合中選擇并放在列表中的任何項(xiàng)目都不匹配,則選擇該選項(xiàng)。
然后,需要確定所傳入集合的類型。在本例中,我將處理兩種情況:通過 ArrayList 傳遞一組字符串,或者數(shù)據(jù)表中的 DataView ,它由 DataRowView 項(xiàng)目構(gòu)成。對(duì)于字符串?dāng)?shù)據(jù),我將輸入一個(gè)新的 ListItem ,并設(shè)置下拉項(xiàng)的值和文本。由于這兩種情況是相同的,所以這里只需要文本。但是我將選擇相應(yīng)的項(xiàng)目來根據(jù)值作出選擇,以便與下一個(gè)示例保持一致,下一個(gè)示例將設(shè)置一個(gè)單獨(dú)的值屬性。對(duì)于 DataRowView 項(xiàng)目,上一個(gè)示例中已指出, DataRowViewInstance("FieldName") 返回一個(gè)表示該字段中的數(shù)據(jù)的對(duì)象。可以使用同樣的方法檢索 DataTextField 和 DataValueFields 需要的值。
最后,拋出一些異常以處理開發(fā)人員使用列時(shí)遇到的常見錯(cuò)誤,例如向 DataField 屬性發(fā)送無效字段名,或傳入不兼容的 DataSource 類型。我已經(jīng)對(duì)要彈出的異常消息進(jìn)行了硬編碼,但希望您在實(shí)際的應(yīng)用程序中將這些消息保存到更容易配置的位置。例如,如果您希望在全球范圍內(nèi)使用您的應(yīng)用程序,則可以保存到您的 web.config 文件或資源文件中。同樣,您不一定非要再次拋出“未找到指定的 DataField”異常,因?yàn)樵? Datagrid 被置于“編輯”模式之前可能已經(jīng)在 ItemDataBinding 事件中捕獲了該異常。
Private Sub EditItemDataBinding(ByVal sender As Object, _ ByVal e As EventArgs) Dim cell As TableCell = CType(sender, TableCell) Dim DDL As DropDownList = _ CType(cell.Controls(0), DropDownList) Dim DataSourceItem As Object Dim item As ListItem Dim DGI As DataGridItem '首先添加一個(gè)空選項(xiàng) DDL.Items.Add(New ListItem("")) For Each DataSourceItem In DataSource Select Case DataSourceItem.GetType.ToString Case "System.String" '應(yīng)用到 ArrayList 示例 item = New ListItem(DataSourceItem, DataSourceItem) DDL.Items.Add(item) Case "System.Data.DataRowView" Dim DRV As DataRowView = _ CType(DataSourceItem, DataRowView) item = New_ ListItem(DRV(DataTextField), DRV(DataValueField)) DDL.Items.Add(item) Case Else Throw New Exception("Invalid DataSource type.") End Select Next Try DGI = CType(cell.NamingContainer, DataGridItem) item = DDL.Items.FindByValue(DGI.DataItem(DataField)) Catch RangeEx As IndexOutOfRangeException Throw New Exception("Specified DataField was not found.") Catch OtherEx As Exception Throw New Exception(OtherEx.InnerException.ToString) End Try If Not item Is Nothing Then item.Selected = True End Sub
使用 DropDownColumn
以上是創(chuàng)建 DropDownColumn 類所需的所有代碼,下面我們看一看如何在應(yīng)用程序中使用該控件。如果您是在家中學(xué)習(xí),而且還沒有開始做,請(qǐng)將上面創(chuàng)建的命名空間編譯到 MyCustomColumn.dll 中,并將其復(fù)制到您想試驗(yàn)的應(yīng)用程序的 /bin 文件夾中。本例中,我創(chuàng)建一個(gè)新的 Web 應(yīng)用程序 UseCustomColumn,并在我的 /bin 目錄的 MyCustomColumn.dll 中添加一個(gè)引用。在 ASPX 文件的頂部,添加 @Register 指令:
<%@ Register TagPrefix="dgg" Namespace="MyCustomColumn" Assembly="MyCustomColumn" %>
請(qǐng)注意,新的 Datagrid 列類型不會(huì)為 Datagrid 出現(xiàn)在 Visual Studio .NET 屬性生成器中,因此您需要進(jìn)入 HTML 視圖并在其中添加列聲明。確保 Datagrid 聲明位于一組 <form runat="server">...</form> 標(biāo)記之中,這些標(biāo)記用于處理 PostBack。ASPX 文件的其余部分應(yīng)如下所示:
<%@ 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 列。現(xiàn)在我只設(shè)置 DataField 屬性,因?yàn)閯倓偨壎ǖ揭粋€(gè)簡(jiǎn)單的 ArrayList ,不需要 DataTextField 和 DataValueField 屬性。如果您有預(yù)定義的常數(shù)列表或者您需要一個(gè)快速設(shè)置選項(xiàng)的方法, ArrayList 選項(xiàng)最簡(jiǎn)單。 DropDownColumn 的 DataSource 在代碼中設(shè)置,首先引用 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
下面是運(yùn)行此代碼的結(jié)果:
圖 3:使用 ArrayList
接下來,我需要轉(zhuǎn)換該示例以便使用數(shù)據(jù)庫中的活動(dòng)表。 ShipVia 是查找表 Shippers 的外鍵,我在代碼中將其指定為 DropDownColumn 的 DataSource 。我還需要改變 DropDownColumn 聲明,以包括與 Shippers 表中的相應(yīng)字段匹配的 DataTextField 和 DataValueField 名稱:
<dgg:DropDownColumn DataField="ShipVia" DataTextField="CompanyName" DataValueField="ShipperID" HeaderText="Ship Method" />
然后將兩個(gè) 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 使用活動(dòng)數(shù)據(jù),根據(jù) Orders 表中的值(1、2 或 3)自動(dòng)選擇正確的項(xiàng)目,如下所示:
圖 4:從數(shù)據(jù)庫中檢索數(shù)據(jù)
使用 DropDownColumn 的最后一步是檢索選定的值以傳遞回?cái)?shù)據(jù)庫更新。為此,只需在單元格內(nèi)引用 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
小結(jié)
上文概述了如何以 DataGridColumn 為父類型創(chuàng)建一個(gè)新類型、如何進(jìn)行數(shù)據(jù)綁定以及如何將其應(yīng)用到實(shí)際應(yīng)用程序中。這只是可重復(fù)使用的 Datagrid 列的一個(gè)示例,因此,您需要檢查您自己的應(yīng)用程序,以確定哪些重復(fù)的功能可以封裝到其自己的自定義 Datagrid 列中。您可以開發(fā)自己的列,以解決常見問題(例如,在列中顯示 DropDownList ),或滿足您公司的特殊需要。您也不必拘泥于本文的示例,只在自定義列中包含一個(gè) ASP.NET 控件,您可以編寫更復(fù)雜的結(jié)構(gòu),例如將一系列控件、第三方內(nèi)容或整個(gè) Datagrid 控件嵌套到列中,以表現(xiàn)多層信息。總之,您可以充分發(fā)揮您的想象力。
5 個(gè)內(nèi)置的列類型非常有用,它們可以滿足使用 Datagrid 控件進(jìn)行顯示的大多數(shù)情況下的需要。現(xiàn)在并沒有開發(fā)您自己的控件,只是將一些有意義的內(nèi)容隨便放到 TemplateColumn 中。創(chuàng)建自定義列使您可以突破這些限制,在您的 Datagrid 應(yīng)用程序中添加豐富的功能。
作者簡(jiǎn)介
“Datagrid 女孩”Marcie Robillard 是 Microsoft 最優(yōu)秀的 ASP.NET 專家,她是一位獨(dú)立的 ASP.NET 顧問和培訓(xùn)師。ASP.NET Datagrid 是她的專業(yè),她還專門為此創(chuàng)建了一個(gè) Web 站點(diǎn) DatagridGirl.com 。您可以從該站點(diǎn)找到優(yōu)秀 Datagrid 文章的鏈接、Datagrid 內(nèi)容的書評(píng)以及不斷增加的 Datagrid 常見問題。Marcie 還花費(fèi)了大量時(shí)間主持 ASP.NET 論壇,回答有關(guān) Datagrid 的各種問題。Marcie 當(dāng)前的任務(wù)是指導(dǎo)各公司開發(fā)自己的 .NET 技術(shù)。如果您的組織需要這方面的專業(yè)咨詢或培訓(xùn),請(qǐng)聯(lián)系 Marcie@DatagridGirl.com 。
參考站點(diǎn):
MetaBuilders.com 。免費(fèi)的自定義 Datagrid 列,包括源代碼 (C#)。
DatagridGirl.com 。有關(guān) Datagrid 的各種資源。
Scott Mitchell 著的《ASP.NET Data Web Controls》,SAMS 2003 年出版。ISBN 0672325012
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
