亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET中Datagrid常見錯誤

2019-11-18 19:45:54
字體:
來源:轉載
供稿:網友

  摘要:學習如何避免在使用 asp.net Datagrid 控件進行開發時可能發生的一些常見錯誤。

  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 事件中執行 .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  
SortCommandSortExPRession
EditCommand EditItemIndex
PageIndexChangedCurrentPageIndex
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 控件,它具備編輯和排序功能,同時還具有在一行內重復顯示記錄的功能。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
另类视频在线观看| 日韩中文字幕精品视频| 欧美日韩亚洲91| 精品视频久久久久久| 91极品女神在线| 秋霞成人午夜鲁丝一区二区三区| 国产欧美在线视频| 国产欧美一区二区三区四区| 91精品久久久久久久| 久久精品久久久久久国产 免费| 日韩有码在线电影| 欧美亚洲一区在线| 91精品国产九九九久久久亚洲| 亚洲精品国精品久久99热| 中文字幕久久久| 日本欧美国产在线| 国产精品6699| 精品国产31久久久久久| 91精品久久久久久久久久另类| 97视频在线观看视频免费视频| 亚洲精品理论电影| 久久精品国产久精国产思思| 成人性生交大片免费看视频直播| 亚洲精品成a人在线观看| 欧美成人精品一区二区三区| 亚洲欧洲激情在线| 亚洲国产中文字幕久久网| 欧美日韩亚洲视频| 日韩中文字幕网址| 亚洲影院高清在线| 亚洲精品二三区| 国产精品福利在线| 国产精品国语对白| 一个人看的www久久| 亚洲视频日韩精品| 亚洲欧美日韩在线一区| 亚洲理论电影网| 亚洲欧美国产日韩中文字幕| 欧美激情一级二级| 热99精品只有里视频精品| 92版电视剧仙鹤神针在线观看| 日韩av电影国产| 国产婷婷97碰碰久久人人蜜臀| 亚洲男人av电影| 欧美xxxx18国产| 日本精品视频在线| 日韩中文有码在线视频| 亚洲美女www午夜| 国产啪精品视频| 亚洲一区二区日本| 欧美整片在线观看| 久久久爽爽爽美女图片| 日韩av在线电影网| 最近2019中文免费高清视频观看www99| 亚洲精品成人网| 亚洲人免费视频| 国产精品美腿一区在线看| 亚洲精品一区二区三区婷婷月| 欧美精品在线播放| 国产视频精品一区二区三区| 热re91久久精品国99热蜜臀| 性金发美女69hd大尺寸| 日韩一区二区三区在线播放| 在线观看不卡av| 精品高清美女精品国产区| 亚洲视频一区二区三区| 社区色欧美激情 | 日韩欧美一区二区三区久久| 久热精品视频在线免费观看| 成人国产精品日本在线| 亚洲天堂色网站| 国产欧美va欧美va香蕉在线| 久久久久久久久久亚洲| 亚洲第一中文字幕| 国产精品一区二区电影| 成人国产精品日本在线| 中文字幕一区二区三区电影| 日韩av在线高清| 国产精品美女www| 欧美激情一级精品国产| 久久91亚洲精品中文字幕奶水| 欧美小视频在线观看| 欧美电影免费观看高清| 伊人av综合网| 久久精品国产清自在天天线| 91性高湖久久久久久久久_久久99| 色99之美女主播在线视频| 97碰碰碰免费色视频| 在线亚洲午夜片av大片| 亚洲国产精品专区久久| 亚洲人成伊人成综合网久久久| 国产精品福利在线| 国产91免费观看| 日韩视频在线免费观看| 日韩在线观看网站| 色与欲影视天天看综合网| 中文字幕欧美精品日韩中文字幕| 538国产精品视频一区二区| 欧美天堂在线观看| 国产成人aa精品一区在线播放| 国产精品色午夜在线观看| 国产亚洲精品va在线观看| 岛国精品视频在线播放| 国产精品日韩欧美综合| 国产精品黄页免费高清在线观看| 亚洲v日韩v综合v精品v| 国产日韩欧美中文在线播放| 欧美天堂在线观看| 欧美另类交人妖| 亚洲一区美女视频在线观看免费| 亚洲国产高潮在线观看| 夜夜嗨av色综合久久久综合网| 亚洲精品久久久久久久久| 麻豆一区二区在线观看| 国产精品欧美一区二区| 97免费在线视频| 欧美成在线观看| 国产一区二区香蕉| 成人福利网站在线观看11| 精品偷拍各种wc美女嘘嘘| 国产成人av网址| 久久国产精品电影| 欧美国产乱视频| 日韩美女福利视频| 国产精品极品尤物在线观看| 欧美性猛交xxxx黑人猛交| 成人有码在线播放| 精品日韩中文字幕| 欧美性猛交xxxx免费看久久久| 日韩中文字幕欧美| 久久久999国产| 免费成人高清视频| 最近2019中文字幕大全第二页| 久久成人在线视频| 亚洲欧美日韩视频一区| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久国产精品视频| 色偷偷噜噜噜亚洲男人| 日韩一二三在线视频播| 久久精品久久久久电影| 国内精品美女av在线播放| 国产日韩欧美在线播放| 国产成人在线一区二区| 精品少妇v888av| 中文字幕欧美专区| 欧美一区三区三区高中清蜜桃| 日韩电影中文字幕av| 久久亚洲国产精品| 日韩av在线网页| 成人a视频在线观看| 亚洲国模精品一区| 欧美日韩亚洲一区二区| 一区二区三区天堂av| 欧美日韩裸体免费视频| 九九热这里只有精品6| 美女黄色丝袜一区| 日韩经典中文字幕| 亚洲综合日韩在线| 日韩中文字幕在线视频播放| 亚洲福利影片在线| 成人黄色免费片| 国产欧美一区二区三区久久| 在线国产精品视频| 欧美视频在线看|