成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當(dāng)前位置:首頁>>開發(fā)編程>>VS.NET>>新聞內(nèi)容
ASP.NET中Datagrid常見錯誤
作者:MS 發(fā)布時間:2004-9-23 15:06:06 文章來源:西部E網(wǎng)
  摘要:學(xué)習(xí)如何避免在使用 ASP.NET Datagrid 控件進(jìn)行開發(fā)時可能發(fā)生的一些常見錯誤。

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

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

  我知道您不會再使用如下所示的代碼,但 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>") 

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

<asp:datagrid runat="server" datasource="MyDataReader"/>

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

  2、忘記在Page_Load事件中檢查IsPostBack

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

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

//VB.NET
Sub Page_Load
If Not IsPostBack Then
BindGrid()
End If
End Sub

//C#
private void Page_Load(object sender, System.EventArgs e)
{
 if(!Page.IsPostBack)
 {
  BindData();
 }
}

  3、需要更大的靈活性時,仍堅(jiān)持使用自動生成的列

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

  注意:如果將 AutoGenerateColumns 的設(shè)置保持為“True”,并且在 Datagrid 的 <columns> 段中指定了列,那么最終將得到對列的重復(fù)設(shè)置。系統(tǒng)將首先顯示特別聲明的列,隨后是所有自動生成的列。

  4、嘗試僅使用控件ID來引用Datagrid項(xiàng)目中的控件

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

Dim MyValue As String = MyTextBox.Text

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

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

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

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

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

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

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

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

  7、持續(xù)使用大型ViewState

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

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

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

事件 是否依賴于 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

  8、使用 ItemDataBound 或 ItemCreated 事件時,忘記檢查適當(dāng)?shù)?ListItemType

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

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

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


最新更新
·C#中使用Split分隔字符串的技
·VS2008開發(fā)中Windows Mobile
·PC機(jī)和移動設(shè)備上絕對路徑的
·C#程序加殼的方法(使用Sixx
·當(dāng)前上下文中不存在名稱Conf
·請插入磁盤:Visual Studio 2
·用VS.NET讀取Flash格式文件信
·在ASP.NET中使用AJAX的簡單方
·VS.NET 2005中常用的一些代碼
·安裝VS.NET 2005 SP1補(bǔ)丁全攻
相關(guān)信息
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實(shí)很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因?yàn)榧拍畔肽?/a>
愛上你等于愛上了錯
在心里從此永遠(yuǎn)有個你
一個人的寂寞兩個人的錯
主站蜘蛛池模板: 汝阳县| 牡丹江市| 抚宁县| 安福县| 浦县| 大埔县| 闵行区| 喀什市| 关岭| 岫岩| 临高县| 行唐县| 芦溪县| 金华市| 红安县| 曲周县| 奉化市| 汨罗市| 竹溪县| 祁门县| 南岸区| 靖安县| 寿光市| 新巴尔虎左旗| 浦东新区| 博客| 家居| 商城县| 额尔古纳市| 永年县| 留坝县| 芦山县| 芜湖市| 沾益县| 行唐县| 昆山市| 淮安市| 夏津县| 姜堰市| 曲松县| 昌平区|