中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁(yè) > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > 常見 Datagrid 錯(cuò)誤
JRun+dw2k4 快速上手jsp開發(fā) 回到列表 進(jìn)入 ASP.NET 世界
 常見 Datagrid 錯(cuò)誤

作者:Marcie Robillard 時(shí)間: 2004-03-24 文檔類型:轉(zhuǎn)載 來自:Microsoft

本文僅代表作者個(gè)人觀點(diǎn),正確與否請(qǐng)讀者自行研究!

原文地址:http://www.microsoft.com/china/msdn/library/dnaspp/html/aspnet-commondatagridmistakes.asp

摘要:學(xué)習(xí)如何避免在使用 ASP.NET Datagrid 控件進(jìn)行開發(fā)時(shí)可能發(fā)生的一些常見錯(cuò)誤(本文包含一些指向英文站點(diǎn)的鏈接)。

目錄

可以使用 Datagrid 創(chuàng)建列表數(shù)據(jù)而沒有使用
忘記在 Page_Load 事件中檢查 IsPostBack
需要更大的靈活性時(shí),仍堅(jiān)持使用自動(dòng)生成的列
嘗試僅使用控件 ID 來引用 Datagrid 項(xiàng)目中的控件
可以(或應(yīng)該)使用分頁(yè)而沒有使用
忘記在每個(gè) Datagrid 事件中執(zhí)行 .DataBind() 調(diào)用,從而導(dǎo)致回發(fā)
運(yùn)行時(shí)不必要地在 Datagrid 中動(dòng)態(tài)創(chuàng)建 Datagrid 控件或列
持續(xù)使用大型 ViewState
使用 ItemDataBound 或 ItemCreated 事件時(shí),忘記檢查適當(dāng)?shù)?ListItemType
需要對(duì)生成的 HTML 有更多的控制時(shí),過多地使用了 Datagrid(Repeater 也許是更好的選擇)
參考資料

Datagrid 控件是 Microsoft® ASP.NET 中功能最強(qiáng)、用途最廣的 Web 控件之一,這一點(diǎn)已經(jīng)得到了 ASP.NET 權(quán)威人士的認(rèn)同。雖然 Datagrid 控件易于使用,但同樣易于給使用者帶來麻煩。以下是許多人所犯的一些錯(cuò)誤,這些人包括從初學(xué)者到富有經(jīng)驗(yàn)的 .NET 專家。您可以看到許多苦悶的使用者在 ASP.NET 新聞組和論壇就這些錯(cuò)誤提出問題。遵循本文概述的相當(dāng)簡(jiǎn)單的步驟,可以幫助您避免這些錯(cuò)誤,并節(jié)約大量的開發(fā)時(shí)間。

可以使用 Datagrid 創(chuàng)建列表數(shù)據(jù)而沒有使用

我知道您不會(huì)再使用如下所示的代碼,但 ASP.NET 領(lǐng)域中許多守舊的用戶仍在繼續(xù)使用它們:

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>")

可以對(duì)以上代碼進(jìn)行簡(jiǎn)化,使其僅為:

<asp:datagrid runat="server" datasource="MyDataReader"/>,并調(diào)用 .DataBind() 方法。即使需要對(duì) HTML 輸出進(jìn)行特殊的控制,您也可以在用戶界面上記錄集的內(nèi)容重復(fù)出現(xiàn)的情況下,使用某個(gè)數(shù)據(jù) Web 控件。

忘記在 Page_Load 事件中檢查 IsPostBack

最常見的錯(cuò)誤之一是忘記在數(shù)據(jù)綁定之前檢查頁(yè)面的 IsPostBack 條件。例如,Datagrid 處于“Edit”(編輯)模式時(shí),忽略該項(xiàng)檢查將導(dǎo)致已編輯的值被數(shù)據(jù)源中的原始值覆蓋。然而,該規(guī)則至少有一個(gè)主要的例外,請(qǐng)參閱持續(xù)使用大型 ViewState。

以下是包含 IsPostBack 檢查的一個(gè)典型 Page_Load 事件。BindGrid() 是一個(gè)例程,用于導(dǎo)入并設(shè)置 Datagrid 的數(shù)據(jù)源,并調(diào)用 DataBind() 方法。

Sub Page_Load
  If Not IsPostBack Then 
    BindGrid()
  End If
End Sub
需要更大的靈活性時(shí),仍堅(jiān)持使用自動(dòng)生成的列

如果 Datagrid 所處的環(huán)境需要任何一種特殊格式,或是需要使用 Datagrid 中的其他任何 Web 控件,那么必須關(guān)閉 AutoGenerateColumns。將 AutoGenerateColumns 屬性的設(shè)置保持為“True”(默認(rèn)設(shè)置)的做法,僅在最簡(jiǎn)單的 Datagrid 方案中有效。但對(duì)幾乎所有實(shí)際的應(yīng)用程序,必須將該屬性設(shè)置為“False”,并在 Datagrid 聲明的 <columns></columns> 段中明確地指定列。Microsoft Visual Studio® .NET 用戶可以使用屬性生成器以圖形化的方式創(chuàng)建這些列。

注意:如果將 AutoGenerateColumns 的設(shè)置保持為“True”,并且在 Datagrid 的 <columns> 段中指定了列,那么最終將得到對(duì)列的重復(fù)設(shè)置。系統(tǒng)將首先顯示特別聲明的列,隨后是所有自動(dòng)生成的列。
嘗試僅使用控件 ID 來引用 Datagrid 項(xiàng)目中的控件

許多人沒有認(rèn)識(shí)到,對(duì)于 Datagrid 的 TemplateColumn 下的 ItemTemplate 中的控件(例如帶有“MyTextBox”ID 的 TextBox 控件),不能在后面的代碼或是在 ASPX 頁(yè)面的 <script> 段中用如下所示的代碼來直接調(diào)用該控件:

Dim MyValue As String = MyTextBox.Text

該代碼將導(dǎo)致可怕的“名稱‘MyTextBox’沒有聲明”錯(cuò)誤。

因?yàn)?Datagrid 是由多個(gè)行(項(xiàng)目)組成的,所以數(shù)據(jù)源中的每一行實(shí)際都會(huì)有一個(gè)單獨(dú)的“MyTextBox”實(shí)例。ASP.NET 在每個(gè)控件的 ID 前面加上該控件層次結(jié)構(gòu)中每個(gè)命名容器的 ID,這樣 Textbox 將具有唯一的 ID,與頁(yè)面中所有其他控件的 ID 都不相同。例如,如果 MyTextBox 處于 DataGrid1 中,那么生成的 ID 將是 DataGrid1:_ctl2:MyTextBox!癬ctl2”代表 MyTextBox 所處的當(dāng)前行。頁(yè)面中其他 MyTextBox 實(shí)例的 ID 可能是 DataGrid1:_ctl3:MyTextBox、DataGrid1:_ctl4:MyTextBox 等等。要檢索需要查找的“MyTextBox”值,需要對(duì)適當(dāng)?shù)?DataGridItem 調(diào)用 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
  '對(duì) MyValue 執(zhí)行操作
End Sub

對(duì) FindControl 調(diào)用的結(jié)果調(diào)用 CType,將會(huì)把返回值由 Object 類型強(qiáng)制轉(zhuǎn)換成 TextBox 類型,以訪問 .Text 屬性。

可以(或應(yīng)該)使用分頁(yè)而沒有使用

用戶未必希望在單個(gè)頁(yè)面上滾動(dòng)查看成千上萬條記錄。請(qǐng)確保您的應(yīng)用程序設(shè)計(jì)合理,能夠處理可能會(huì)返回大量記錄的情況。有關(guān)如何在 Datagrid 中實(shí)現(xiàn)分頁(yè)的信息,請(qǐng)參閱 Paging in DataGrid QuickStart Tutorial。在 Scott Mitchell 的文章 Creating a Pageable, Sortable DataGrid 中可以找到更多的信息。

忘記在每個(gè) Datagrid 事件中執(zhí)行 .DataBind() 調(diào)用,從而導(dǎo)致回發(fā)

一個(gè)常見的問題是:“當(dāng)我點(diǎn)擊 Datagrid 某一行中的 Edit(編輯)鏈接時(shí),頁(yè)面回發(fā),且不包含任何數(shù)據(jù)。這是什么錯(cuò)誤?”問題在于數(shù)據(jù)僅在頁(yè)面第一次被調(diào)用時(shí)綁定到網(wǎng)格。在每個(gè) Datagrid 事件(Edit、Update、Cancel、PageSort)中,請(qǐng)確保設(shè)置了 Datagrid 的 Datasource 屬性(除非已經(jīng)在 <asp:Datagrid> 聲明中通過聲明的方式進(jìn)行了設(shè)置),并對(duì) Datagrid 調(diào)用了 DataBind() 方法。

運(yùn)行時(shí)不必要地在 Datagrid 中動(dòng)態(tài)創(chuàng)建 Datagrid 控件或列

在某些業(yè)務(wù)和技術(shù)方案中,在運(yùn)行時(shí)創(chuàng)建 ASP.NET 控件是必要的,也是完全合適的。例如,有時(shí)需要在選擇其他頁(yè)面選項(xiàng)后,才能在運(yùn)行時(shí)確定用戶界面;蚴且?jiǎng)?chuàng)建一個(gè)復(fù)合服務(wù)器控件,其中的每個(gè)子控件都需要?jiǎng)討B(tài)創(chuàng)建,因?yàn)闊o法以聲明的方式創(chuàng)建這些子控件。如果遇到這些情況,請(qǐng)注意,提交頁(yè)面時(shí)不要保留這些動(dòng)態(tài)控件。必須在頁(yè)面生命周期的早期,在每次回發(fā)時(shí)重新創(chuàng)建動(dòng)態(tài)控件(例如在 Page_Init 事件中)。警言:創(chuàng)建控件要早,創(chuàng)建控件要勤。有關(guān)如何動(dòng)態(tài)創(chuàng)建控件的詳細(xì)信息,請(qǐng)參閱 Microsoft Knowledge Base 文章 HOW TO:Dynamically Create Controls in ASP.NET with Visual Basic .NET。

然而,如果 Datagrid 應(yīng)用程序中不是一定需要?jiǎng)討B(tài)創(chuàng)建控件,請(qǐng)避免使用該技術(shù),以免遇到麻煩。盡管可能創(chuàng)建動(dòng)態(tài) Datagrid,但它們會(huì)引發(fā)各種事件,這通常都會(huì)令人頭疼。換句話說,不要?jiǎng)討B(tài)創(chuàng)建控件,以避免因?yàn)閯?chuàng)建控件使 ASPX 文件變得散亂。

持續(xù)使用大型 ViewState

Datagrid 控件會(huì)在頁(yè)面中添加大量的 ViewState,這一點(diǎn)令人討厭,因?yàn)檫@會(huì)導(dǎo)致呈現(xiàn)給用戶的頁(yè)面的總體大小急劇增加。要使頁(yè)面大小不增加,最簡(jiǎn)單的方法是無論對(duì)整個(gè)頁(yè)面,還是單獨(dú)對(duì)某些特定的控件,都禁用 ViewState。例如,如果頁(yè)面不產(chǎn)生回發(fā),那么對(duì)整個(gè)頁(yè)面禁用 ViewState 是安全的。否則,請(qǐng)對(duì)兩次回發(fā)之間狀態(tài)信息不會(huì)發(fā)生更改的各個(gè)控件禁用 ViewState,或者對(duì)不需要隱藏字段來跟蹤自身狀態(tài)的那些控件禁用 ViewState。

對(duì) Datagrid 控件或包含 Datagrid 的頁(yè)面禁用 ViewState 時(shí),如果 Datagrid 會(huì)啟動(dòng)回發(fā)事件,那么需要執(zhí)行一些特殊的步驟。首先,必須在每次回發(fā)時(shí)在 Page_Load 中重新綁定 Datagrid。這有違常規(guī)做法(以及上述第二個(gè)問題中的描述)。但如果禁用 ViewState,該步驟是必需的,這樣在執(zhí)行 Page_Load 后可以正確地引發(fā)其他 Datagrid 事件。如果要處理以下 Datagrid 事件中的任何一部分(或全部),那么還需要在 ViewState 中手動(dòng)存儲(chǔ)一些 Datagrid 屬性。例如,在禁用了 ViewState 的 Datagrid 中進(jìn)行編輯時(shí),只要是在 Page_Load 中第一次綁定 Datagrid 之前重新存儲(chǔ) EditItemIndex,且 Datagrid 處于編輯模式,那么只需將 EditItemIndex 儲(chǔ)存到 ViewState 就夠了(請(qǐng)參閱示例代碼)。

表 1:Datagrid 事件與 ViewState 的依賴關(guān)系

事件 是否依賴于 ViewState? 要存儲(chǔ)在 ViewState 中的字段
ItemCreated  
ItemDataBound  
SortCommand SortExpression
EditCommand EditItemIndex
PageIndexChanged CurrentPageIndex
SelectedIndexChanged  

清單 1:?jiǎn)⒂镁庉嫛⑴判蚝头猪?yè),但禁用 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 事件時(shí),忘記檢查適當(dāng)?shù)?ListItemType

Datagrid 控件對(duì)每個(gè)數(shù)據(jù)行引發(fā)兩個(gè)事件。首次將每行添加到 Datagrid 時(shí)將引發(fā) ItemCreated 事件,將數(shù)據(jù)綁定到每行時(shí)將引發(fā) ItemDataBound 事件。添加單元格到 Datagrid 的表格輸出時(shí),這些事件可以用于控制每個(gè)單元格的外觀或內(nèi)容。例如,可以基于數(shù)值的范圍修改單元格的背景顏色。但關(guān)鍵是要記住,這些事件的引發(fā)針對(duì)的是所有 Datagrid 項(xiàng)目類型,包括頁(yè)眉、頁(yè)腳和分頁(yè)程序項(xiàng)目。如果執(zhí)行 ItemDataBound 事件期間,沒有在引用項(xiàng)目的數(shù)據(jù)之前仔細(xì)檢查項(xiàng)目類型,第一個(gè)項(xiàng)目(通常是標(biāo)題行)就將發(fā)生錯(cuò)誤。如果 Datagrid 啟用了分頁(yè),且將其設(shè)置為在頂端顯示,那么第一個(gè)項(xiàng)目就會(huì)成為分頁(yè)程序項(xiàng)目。以下示例代碼顯示如何在引用項(xiàng)目數(shù)據(jù)之前進(jìn)行正確的 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
需要對(duì)生成的 HTML 有更多的控制時(shí),過多地使用了 Datagrid(Repeater 也許是更好的選擇)

如果懶散的程序員喜歡 Datagrid 控件(因?yàn)?Datagrid 控件為他們完成了很多工作),那么有著極強(qiáng)控制欲的程序員必定喜歡 Repeater 控件。如果需要或希望完全控制創(chuàng)建的所有 HTML,請(qǐng)使用 Repeater 控件,它能幫助您完成該任務(wù)。Repeater 控件在性能上也略占優(yōu)勢(shì),因?yàn)樗幌?Datagrid 控件的所有內(nèi)置功能那樣占用系統(tǒng)資源。也可以考慮使用折衷的 DataList 控件,它具備編輯和排序功能,同時(shí)還具有在一行內(nèi)重復(fù)顯示記錄的功能。

參考資料

出處:Microsoft
責(zé)任編輯:cjj

◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
[asp.net]C#教程
進(jìn)入 ASP.NET 世界
面向?qū)ο蟮膽?yīng)用服務(wù)層設(shè)計(jì)
解讀 C# 中的正則表達(dá)式
ASP.NET中的datagrid控件初步
作者文章
常見 Datagrid 錯(cuò)誤
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁(yè)制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大!熬•自然”設(shè)計(jì)大賽開啟
國(guó)際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國(guó)國(guó)防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡(jiǎn)單繪制一個(gè)可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡(jiǎn)單的作品展示頁(yè)面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請(qǐng)不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請(qǐng)與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊(cè) 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請(qǐng)用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請(qǐng)不要在評(píng)論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請(qǐng)您注意:
·不良評(píng)論請(qǐng)用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測(cè)試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2