ASP.NET中Datagrid常見錯誤(2)_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:在網頁中動態的生成一個圖片
      大家知道股票網站的K線圖是動態生成的定時刷新PHP 就有動態生成圖片的功能.那么怎樣用asp.net在網頁中動態的生成一個圖片呢? 下面我要舉的例子是動態的生成一個圖片顯示當前時間.

      運行時不必要地在 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 控件,它具備編輯和排序功能,同時還具有在一行內重復顯示記錄的功能。

      分享:C#是一種新的語言?或者僅僅只是Java
      最開始時微軟公司將Java當做一種能解決C和C 中存在的問題的語言,并不在意,并繼續維持和培訓著其C和C 技術和編程人員。接下來不幸的是,正當微軟盡力在Visual J 基礎上拓展Java功能,并使之

      共2頁上一頁12下一頁
      來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
      相關.Net教程