| 導購 | 订阅 | 在线投稿
分享
 
 
 

常見 Datagrid 錯誤

來源:互聯網  2008-06-01 01:10:45  評論

摘要:學習如何避免在使用 Asp.Net Datagrid 控件進行開發時可能發生的一些常見錯誤(本文包含一些指向英文站點的鏈接)。目錄

可以使用 Datagrid 創建列表數據而沒有使用

忘記在 Page_Load 事件中檢查 IsPostBack

需要更大的靈活性時,仍堅持使用自動生成的列

嘗試僅使用控件 ID 來引用 Datagrid 項目中的控件

可以(或應該)使用分頁而沒有使用

忘記在每個 Datagrid 事件中執行 .DataBind() 調用,從而導致回發

運行時不必要地在 Datagrid 中動態創建 Datagrid 控件或列

持續使用大型 ViewState

使用 ItemDataBound 或 ItemCreated 事件時,忘記檢查適當的 ListItemType

需要對生成的 HTML 有更多的控制時,過多地使用了 Datagrid(Repeater 也許是更好的選擇)

參考資料

Datagrid 控件是 Microsoft® ASP.NET 中功能最強、用途最廣的 Web 控件之一,這一點已經得到了 ASP.NET 權威人士的認同。雖然 Datagrid 控件易于使用,但同樣易于給使用者帶來麻煩。以下是許多人所犯的一些錯誤,這些人包括從初學者到富有經驗的 .NET 專家。您可以看到許多苦悶的使用者在 ASP.NET 新聞組和論壇就這些錯誤提出問題。遵循本文概述的相當簡單的步驟,可以幫助您避免這些錯誤,並節約大量的開發時間。可以使用 Datagrid 創建列表數據而沒有使用

我知道您不會再使用如下所示的代碼,但 ASP.NET 領域中許多守舊的用戶仍在繼續使用它們:Response.Write("<table>")

While MyDataReader.Read()

Response.Write("<tr>")

Response.Write("<td>")

Response.Write(MyDataReader(0))

Response.Write("</td>")

Response.Write("</tr>")

Loop

Response.Write("</table>")

可以對以上代碼進行簡化,使其僅爲:

<asp:datagrid runat="server" datasource="MyDataReader"/>,並調用 .DataBind() 方法。即使需要對 Html 輸出進行非凡的控制,您也可以在用戶界面上記錄集的內容重複出現的情況下,使用某個數據 Web 控件。忘記在 Page_Load 事件中檢查 IsPostBack

最常見的錯誤之一是忘記在數據綁定之前檢查頁面的 IsPostBack 條件。例如,Datagrid 處于「Edit」(編輯)模式時,忽略該項檢查將導致已編輯的值被數據源中的原始值覆蓋。然而,該規則至少有一個主要的例外,請參閱持續使用大型 ViewState。

以下是包含 IsPostBack 檢查的一個典型 Page_Load 事件。BindGrid() 是一個例程,用于導入並設置 Datagrid 的數據源,並調用 DataBind() 方法。Sub Page_Load

If Not IsPostBack Then

BindGrid()

End If

End Sub

需要更大的靈活性時,仍堅持使用自動生成的列

假如 Datagrid 所處的環境需要任何一種非凡格式,或是需要使用 Datagrid 中的其他任何 Web 控件,那麽必須關閉 AutoGenerateColumns。將 AutoGenerateColumns 屬性的設置保持爲「True」(默認設置)的做法,僅在最簡單的 Datagrid 方案中有效。但對幾乎所有實際的應用程序,必須將該屬性設置爲「False」,並在 Datagrid 聲明的 <columns></columns> 段中明確地指定列。Microsoft Visual Studio® .NET 用戶可以使用屬性生成器以圖形化的方式創建這些列。

注重:假如將 AutoGenerateColumns 的設置保持爲「True」,並且在 Datagrid 的 <columns> 段中指定了列,那麽最終將得到對列的重複設置。系統將首先顯示非凡聲明的列,隨後是所有自動生成的列。嘗試僅使用控件 ID 來引用 Datagrid 項目中的控件

許多人沒有熟悉到,對于 Datagrid 的 TemplateColumn 下的 ItemTemplate 中的控件(例如帶有「MyTextBox」ID 的 TextBox 控件),不能在後面的代碼或是在 ASPX 頁面的 <script> 段中用如下所示的代碼來直接調用該控件:Dim MyValue As String = MyTextBox.Text

該代碼將導致可怕的「名稱『MyTextBox』沒有聲明」錯誤。

因爲 Datagrid 是由多個行(項目)組成的,所以數據源中的每一行實際都會有一個單獨的「MyTextBox」實例。ASP.NET 在每個控件的 ID 前面加上該控件層次結構中每個命名容器的 ID,這樣 Textbox 將具有唯一的 ID,與頁面中所有其他控件的 ID 都不相同。例如,假如 MyTextBox 處于 DataGrid1 中,那麽生成的 ID 將是 DataGrid1:_ctl2:MyTextBox。「_ctl2」代表 MyTextBox 所處的當前行。頁面中其他 MyTextBox 實例的 ID 可能是 DataGrid1:_ctl3:MyTextBox、DataGrid1:_ctl4:MyTextBox 等等。要檢索需要查找的「MyTextBox」值,需要對適當的 DataGridItem 調用 FindControl 方法。該 DataGridItem 用作 TextBox 的父命名容器。

HTML:<asp:Datagrid runat="server" id="Datagrid1">

<Columns>

<asp:TemplateColumn>

<ItemTemplate>

<asp:TextBox runat="server" id="MyTextBox"/>

</ItemTemplate>

</asp:TemplateColumn>

</Columns>

代碼:Sub DataGrid1_UpdateCommand(sender As Object, _

e As DataGridCommandEventArgs)

Dim MyValue As String = _

CType(e.Item.FindControl("MyTextBox"), TextBox).Text

'對 MyValue 執行操作

End Sub

對 FindControl 調用的結果調用 CType,將會把返回值由 Object 類型強制轉換成 TextBox 類型,以訪問 .Text 屬性。可以(或應該)使用分頁而沒有使用

用戶未必希望在單個頁面上滾動查看成千上萬條記錄。請確保您的應用程序設計合理,能夠處理可能會返回大量記錄的情況。有關如何在 Datagrid 中實現分頁的信息,請參閱 Paging in DataGrid QuickStart Tutorial。在 Scott Mitchell 的文章 Creating a Pageable, Sortable DataGrid 中可以找到更多的信息。忘記在每個 Datagrid 事件中執行 .DataBind() 調用,從而導致回發

一個常見的問題是:「當我點擊 Datagrid 某一行中的 Edit(編輯)鏈接時,頁面回發,且不包含任何數據。這是什麽錯誤?」問題在于數據僅在頁面第一次被調用時綁定到網格。在每個 Datagrid 事件(Edit、Update、Cancel、Page 或 Sort)中,請確保設置了 Datagrid 的 Datasource 屬性(除非已經在 <asp:Datagrid> 聲明中通過聲明的方式進行了設置),並對 Datagrid 調用了 DataBind() 方法。運行時不必要地在 Datagrid 中動態創建 Datagrid 控件或列

在某些業務和技術方案中,在運行時創建 ASP.NET 控件是必要的,也是完全合適的。例如,有時需要在選擇其他頁面選項後,才能在運行時確定用戶界面。或是要創建一個複合服務器控件,其中的每個子控件都需要動態創建,因爲無法以聲明的方式創建這些子控件。假如碰到這些情況,請注重,提交頁面時不要保留這些動態控件。必須在頁面生命周期的早期,在每次回發時重新創建動態控件(例如在 Page_Init 事件中)。警言:創建控件要早,創建控件要勤。有關如何動態創建控件的具體信息,請參閱 Microsoft Knowledge Base 文章 HOW TO:Dynamically Create Controls in ASP.NET with Visual Basic .NET。

然而,假如 Datagrid 應用程序中不是一定需要動態創建控件,請避免使用該技術,以免碰到麻煩。盡管可能創建動態 Datagrid,但它們會引發各種事件,這通常都會令人頭疼。換句話說,不要動態創建控件,以避免因爲創建控件使 ASPX 文件變得散亂。持續使用大型 ViewState

Datagrid 控件會在頁面中添加大量的 ViewState,這一點令人討厭,因爲這會導致呈現給用戶的頁面的總體大小急劇增加。要使頁面大小不增加,最簡單的方法是無論對整個頁面,還是單獨對某些特定的控件,都禁用 ViewState。例如,假如頁面不産生回發,那麽對整個頁面禁用 ViewState 是安全的。否則,請對兩次回發之間狀態信息不會發生更改的各個控件禁用 ViewState,或者對不需要隱藏字段來跟蹤自身狀態的那些控件禁用 ViewState。

對 Datagrid 控件或包含 Datagrid 的頁面禁用 ViewState 時,假如 Datagrid 會啓動回發事件,那麽需要執行一些非凡的步驟。首先,必須在每次回發時在 Page_Load 中重新綁定 Datagrid。這有違常規做法(以及上述第二個問題中的描述)。但假如禁用 ViewState,該步驟是必需的,這樣在執行 Page_Load 後可以正確地引發其他 Datagrid 事件。假如要處理以下 Datagrid 事件中的任何一部分(或全部),那麽還需要在 ViewState 中手動存儲一些 Datagrid 屬性。例如,在禁用了 ViewState 的 Datagrid 中進行編輯時,只要是在 Page_Load 中第一次綁定 Datagrid 之前重新存儲 EditItemIndex,且 Datagrid 處于編輯模式,那麽只需將 EditItemIndex 儲存到 ViewState 就夠了(請參閱示例代碼)。

表 1:Datagrid 事件與 ViewState 的依靠關系

事件

是否依靠于 ViewState?

要存儲在 ViewState 中的字段

ItemCreated

ItemDataBound

SortCommand

SortEXPression

EditCommand

EditItemIndex

PageIndexChanged

CurrentPageIndex

SelectedIndexChanged

清單 1:啓用編輯、排序和分頁,但禁用 ViewState 的 Datagrid 的示例代碼。Sub Page_Load

If Not ViewState("EditItemIndex") Is Nothing Then

Datagrid1.EditItemIndex = ViewState("EditItemIndex")

End If

If Not ViewState("CurrentPageIndex") Is Nothing Then

Datagrid1.CurrentPageIndex = ViewState("CurrentPageIndex")

End If

BindGrid()

End Sub

Sub BindGrid()

Dim DV As DataView

DV = GetDataSource()

DV.Sort = ViewState("SortExpression")

Datagrid1.DataSource = DV

Datagrid1.DataBind()

End Sub

Sub Datagrid1_SortCommand(s As Object, _

e As DataGridSortCommandEventArgs)

ViewState("SortExpression") = e.SortExpression

BindGrid()

End Sub

Sub Datagrid1_EditCommand(s As Object, _

e As DatagridCommandEventArgs)

Datagrid1.EditItemIndex = e.Item.ItemIndex

ViewState("EditItemIndex") = e.Item.ItemIndex

BindGrid()

End Sub

Sub Datagrid1_PageIndexChanged(s as Object, _

e As DataGridPageChangedEventArgs)

Datagrid1.CurrentPageIndex = e.NewPageIndex

ViewState("CurrentPageIndex") = e.NewPageIndex

BindGrid()

End Sub

使用 ItemDataBound 或 ItemCreated 事件時,忘記檢查適當的 ListItemType

Datagrid 控件對每個數據行引發兩個事件。首次將每行添加到 Datagrid 時將引發 ItemCreated 事件,將數據綁定到每行時將引發 ItemDataBound 事件。添加單元格到 Datagrid 的表格輸出時,這些事件可以用于控制每個單元格的外觀或內容。例如,可以基于數值的範圍修改單元格的背景顔色。但要害是要記住,這些事件的引發針對的是所有 Datagrid 項目類型,包括頁眉、頁腳和分頁程序項目。假如執行 ItemDataBound 事件期間,沒有在引用項目的數據之前仔細檢查項目類型,第一個項目(通常是標題行)就將發生錯誤。假如 Datagrid 啓用了分頁,且將其設置爲在頂端顯示,那麽第一個項目就會成爲分頁程序項目。以下示例代碼顯示如何在引用項目數據之前進行正確的 ListItemType 檢查。不要忘了 AlternatingItem!Sub DataGrid1_ItemDataBound(source As Object, _

e As DataGridItemEventArgs)

If (e.Item.ItemType = ListItemType.Item Or _

e.Item.ItemType = ListItemType.AlternatingItem) Then

If e.Item.DataItem("ForumDate") < DateTime.Today Then

e.Item.Cells(1).BackColor =

System.Drawing.Color.FromName("#ffccff")

End If

End If

End Sub

需要對生成的 HTML 有更多的控制時,過多地使用了 Datagrid(Repeater 也許是更好的選擇)

假如懶散的程序員喜歡 Datagrid 控件(因爲 Datagrid 控件爲他們完成了很多工作),那麽有著極強控制欲的程序員必定喜歡 Repeater 控件。假如需要或希望完全控制創建的所有 HTML,請使用 Repeater 控件,它能幫助您完成該任務。Repeater 控件在性能上也略占優勢,因爲它不像 Datagrid 控件的所有內置功能那樣占用系統資源。也可以考慮使用折衷的 DataList 控件,它具備編輯和排序功能,同時還具有在一行內重複顯示記錄的功能。

摘要:學習如何避免在使用 Asp.Net Datagrid 控件進行開發時可能發生的一些常見錯誤(本文包含一些指向英文站點的鏈接)。目錄 可以使用 Datagrid 創建列表數據而沒有使用 忘記在 Page_Load 事件中檢查 IsPostBack 需要更大的靈活性時,仍堅持使用自動生成的列 嘗試僅使用控件 ID 來引用 Datagrid 項目中的控件 可以(或應該)使用分頁而沒有使用 忘記在每個 Datagrid 事件中執行 .DataBind() 調用,從而導致回發 運行時不必要地在 Datagrid 中動態創建 Datagrid 控件或列 持續使用大型 ViewState 使用 ItemDataBound 或 ItemCreated 事件時,忘記檢查適當的 ListItemType 需要對生成的 HTML 有更多的控制時,過多地使用了 Datagrid(Repeater 也許是更好的選擇) 參考資料 Datagrid 控件是 Microsoft® ASP.NET 中功能最強、用途最廣的 Web 控件之一,這一點已經得到了 ASP.NET 權威人士的認同。雖然 Datagrid 控件易于使用,但同樣易于給使用者帶來麻煩。以下是許多人所犯的一些錯誤,這些人包括從初學者到富有經驗的 .NET 專家。您可以看到許多苦悶的使用者在 ASP.NET 新聞組和論壇就這些錯誤提出問題。遵循本文概述的相當簡單的步驟,可以幫助您避免這些錯誤,並節約大量的開發時間。可以使用 Datagrid 創建列表數據而沒有使用 我知道您不會再使用如下所示的代碼,但 ASP.NET 領域中許多守舊的用戶仍在繼續使用它們:Response.Write("<table>") While MyDataReader.Read() Response.Write("<tr>") Response.Write("<td>") Response.Write(MyDataReader(0)) Response.Write("</td>") Response.Write("</tr>") Loop Response.Write("</table>") 可以對以上代碼進行簡化,使其僅爲: <asp:datagrid runat="server" datasource="MyDataReader"/>,並調用 .DataBind() 方法。即使需要對 Html 輸出進行非凡的控制,您也可以在用戶界面上記錄集的內容重複出現的情況下,使用某個數據 Web 控件。忘記在 Page_Load 事件中檢查 IsPostBack 最常見的錯誤之一是忘記在數據綁定之前檢查頁面的 IsPostBack 條件。例如,Datagrid 處于「Edit」(編輯)模式時,忽略該項檢查將導致已編輯的值被數據源中的原始值覆蓋。然而,該規則至少有一個主要的例外,請參閱持續使用大型 ViewState。 以下是包含 IsPostBack 檢查的一個典型 Page_Load 事件。BindGrid() 是一個例程,用于導入並設置 Datagrid 的數據源,並調用 DataBind() 方法。Sub Page_Load If Not IsPostBack Then BindGrid() End If End Sub 需要更大的靈活性時,仍堅持使用自動生成的列 假如 Datagrid 所處的環境需要任何一種非凡格式,或是需要使用 Datagrid 中的其他任何 Web 控件,那麽必須關閉 AutoGenerateColumns。將 AutoGenerateColumns 屬性的設置保持爲「True」(默認設置)的做法,僅在最簡單的 Datagrid 方案中有效。但對幾乎所有實際的應用程序,必須將該屬性設置爲「False」,並在 Datagrid 聲明的 <columns></columns> 段中明確地指定列。Microsoft Visual Studio® .NET 用戶可以使用屬性生成器以圖形化的方式創建這些列。 注重:假如將 AutoGenerateColumns 的設置保持爲「True」,並且在 Datagrid 的 <columns> 段中指定了列,那麽最終將得到對列的重複設置。系統將首先顯示非凡聲明的列,隨後是所有自動生成的列。嘗試僅使用控件 ID 來引用 Datagrid 項目中的控件 許多人沒有熟悉到,對于 Datagrid 的 TemplateColumn 下的 ItemTemplate 中的控件(例如帶有「MyTextBox」ID 的 TextBox 控件),不能在後面的代碼或是在 ASPX 頁面的 <script> 段中用如下所示的代碼來直接調用該控件:Dim MyValue As String = MyTextBox.Text 該代碼將導致可怕的「名稱『MyTextBox』沒有聲明」錯誤。 因爲 Datagrid 是由多個行(項目)組成的,所以數據源中的每一行實際都會有一個單獨的「MyTextBox」實例。ASP.NET 在每個控件的 ID 前面加上該控件層次結構中每個命名容器的 ID,這樣 Textbox 將具有唯一的 ID,與頁面中所有其他控件的 ID 都不相同。例如,假如 MyTextBox 處于 DataGrid1 中,那麽生成的 ID 將是 DataGrid1:_ctl2:MyTextBox。「_ctl2」代表 MyTextBox 所處的當前行。頁面中其他 MyTextBox 實例的 ID 可能是 DataGrid1:_ctl3:MyTextBox、DataGrid1:_ctl4:MyTextBox 等等。要檢索需要查找的「MyTextBox」值,需要對適當的 DataGridItem 調用 FindControl 方法。該 DataGridItem 用作 TextBox 的父命名容器。 HTML:<asp:Datagrid runat="server" id="Datagrid1"> <Columns> <asp:TemplateColumn> <ItemTemplate> <asp:TextBox runat="server" id="MyTextBox"/> </ItemTemplate> </asp:TemplateColumn> </Columns> 代碼:Sub DataGrid1_UpdateCommand(sender As Object, _ e As DataGridCommandEventArgs) Dim MyValue As String = _ CType(e.Item.FindControl("MyTextBox"), TextBox).Text '對 MyValue 執行操作 End Sub 對 FindControl 調用的結果調用 CType,將會把返回值由 Object 類型強制轉換成 TextBox 類型,以訪問 .Text 屬性。可以(或應該)使用分頁而沒有使用 用戶未必希望在單個頁面上滾動查看成千上萬條記錄。請確保您的應用程序設計合理,能夠處理可能會返回大量記錄的情況。有關如何在 Datagrid 中實現分頁的信息,請參閱 Paging in DataGrid QuickStart Tutorial。在 Scott Mitchell 的文章 Creating a Pageable, Sortable DataGrid 中可以找到更多的信息。忘記在每個 Datagrid 事件中執行 .DataBind() 調用,從而導致回發 一個常見的問題是:「當我點擊 Datagrid 某一行中的 Edit(編輯)鏈接時,頁面回發,且不包含任何數據。這是什麽錯誤?」問題在于數據僅在頁面第一次被調用時綁定到網格。在每個 Datagrid 事件(Edit、Update、Cancel、Page 或 Sort)中,請確保設置了 Datagrid 的 Datasource 屬性(除非已經在 <asp:Datagrid> 聲明中通過聲明的方式進行了設置),並對 Datagrid 調用了 DataBind() 方法。運行時不必要地在 Datagrid 中動態創建 Datagrid 控件或列 在某些業務和技術方案中,在運行時創建 ASP.NET 控件是必要的,也是完全合適的。例如,有時需要在選擇其他頁面選項後,才能在運行時確定用戶界面。或是要創建一個複合服務器控件,其中的每個子控件都需要動態創建,因爲無法以聲明的方式創建這些子控件。假如碰到這些情況,請注重,提交頁面時不要保留這些動態控件。必須在頁面生命周期的早期,在每次回發時重新創建動態控件(例如在 Page_Init 事件中)。警言:創建控件要早,創建控件要勤。有關如何動態創建控件的具體信息,請參閱 Microsoft Knowledge Base 文章 HOW TO:Dynamically Create Controls in ASP.NET with Visual Basic .NET。 然而,假如 Datagrid 應用程序中不是一定需要動態創建控件,請避免使用該技術,以免碰到麻煩。盡管可能創建動態 Datagrid,但它們會引發各種事件,這通常都會令人頭疼。換句話說,不要動態創建控件,以避免因爲創建控件使 ASPX 文件變得散亂。持續使用大型 ViewState Datagrid 控件會在頁面中添加大量的 ViewState,這一點令人討厭,因爲這會導致呈現給用戶的頁面的總體大小急劇增加。要使頁面大小不增加,最簡單的方法是無論對整個頁面,還是單獨對某些特定的控件,都禁用 ViewState。例如,假如頁面不産生回發,那麽對整個頁面禁用 ViewState 是安全的。否則,請對兩次回發之間狀態信息不會發生更改的各個控件禁用 ViewState,或者對不需要隱藏字段來跟蹤自身狀態的那些控件禁用 ViewState。 對 Datagrid 控件或包含 Datagrid 的頁面禁用 ViewState 時,假如 Datagrid 會啓動回發事件,那麽需要執行一些非凡的步驟。首先,必須在每次回發時在 Page_Load 中重新綁定 Datagrid。這有違常規做法(以及上述第二個問題中的描述)。但假如禁用 ViewState,該步驟是必需的,這樣在執行 Page_Load 後可以正確地引發其他 Datagrid 事件。假如要處理以下 Datagrid 事件中的任何一部分(或全部),那麽還需要在 ViewState 中手動存儲一些 Datagrid 屬性。例如,在禁用了 ViewState 的 Datagrid 中進行編輯時,只要是在 Page_Load 中第一次綁定 Datagrid 之前重新存儲 EditItemIndex,且 Datagrid 處于編輯模式,那麽只需將 EditItemIndex 儲存到 ViewState 就夠了(請參閱示例代碼)。 表 1:Datagrid 事件與 ViewState 的依靠關系 事件 是否依靠于 ViewState? 要存儲在 ViewState 中的字段 ItemCreated 無 ItemDataBound 無 SortCommand 是 SortEXPression EditCommand 是 EditItemIndex PageIndexChanged 是 CurrentPageIndex SelectedIndexChanged 無 清單 1:啓用編輯、排序和分頁,但禁用 ViewState 的 Datagrid 的示例代碼。Sub Page_Load If Not ViewState("EditItemIndex") Is Nothing Then Datagrid1.EditItemIndex = ViewState("EditItemIndex") End If If Not ViewState("CurrentPageIndex") Is Nothing Then Datagrid1.CurrentPageIndex = ViewState("CurrentPageIndex") End If BindGrid() End Sub Sub BindGrid() Dim DV As DataView DV = GetDataSource() DV.Sort = ViewState("SortExpression") Datagrid1.DataSource = DV Datagrid1.DataBind() End Sub Sub Datagrid1_SortCommand(s As Object, _ e As DataGridSortCommandEventArgs) ViewState("SortExpression") = e.SortExpression BindGrid() End Sub Sub Datagrid1_EditCommand(s As Object, _ e As DatagridCommandEventArgs) Datagrid1.EditItemIndex = e.Item.ItemIndex ViewState("EditItemIndex") = e.Item.ItemIndex BindGrid() End Sub Sub Datagrid1_PageIndexChanged(s as Object, _ e As DataGridPageChangedEventArgs) Datagrid1.CurrentPageIndex = e.NewPageIndex ViewState("CurrentPageIndex") = e.NewPageIndex BindGrid() End Sub 使用 ItemDataBound 或 ItemCreated 事件時,忘記檢查適當的 ListItemType Datagrid 控件對每個數據行引發兩個事件。首次將每行添加到 Datagrid 時將引發 ItemCreated 事件,將數據綁定到每行時將引發 ItemDataBound 事件。添加單元格到 Datagrid 的表格輸出時,這些事件可以用于控制每個單元格的外觀或內容。例如,可以基于數值的範圍修改單元格的背景顔色。但要害是要記住,這些事件的引發針對的是所有 Datagrid 項目類型,包括頁眉、頁腳和分頁程序項目。假如執行 ItemDataBound 事件期間,沒有在引用項目的數據之前仔細檢查項目類型,第一個項目(通常是標題行)就將發生錯誤。假如 Datagrid 啓用了分頁,且將其設置爲在頂端顯示,那麽第一個項目就會成爲分頁程序項目。以下示例代碼顯示如何在引用項目數據之前進行正確的 ListItemType 檢查。不要忘了 AlternatingItem!Sub DataGrid1_ItemDataBound(source As Object, _ e As DataGridItemEventArgs) If (e.Item.ItemType = ListItemType.Item Or _ e.Item.ItemType = ListItemType.AlternatingItem) Then If e.Item.DataItem("ForumDate") < DateTime.Today Then e.Item.Cells(1).BackColor = System.Drawing.Color.FromName("#ffccff") End If End If End Sub 需要對生成的 HTML 有更多的控制時,過多地使用了 Datagrid(Repeater 也許是更好的選擇) 假如懶散的程序員喜歡 Datagrid 控件(因爲 Datagrid 控件爲他們完成了很多工作),那麽有著極強控制欲的程序員必定喜歡 Repeater 控件。假如需要或希望完全控制創建的所有 HTML,請使用 Repeater 控件,它能幫助您完成該任務。Repeater 控件在性能上也略占優勢,因爲它不像 Datagrid 控件的所有內置功能那樣占用系統資源。也可以考慮使用折衷的 DataList 控件,它具備編輯和排序功能,同時還具有在一行內重複顯示記錄的功能。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有