日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

常见 Datagrid 错误

發布時間:2023/11/27 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见 Datagrid 错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Marcie Robillard
DatagridGirl.com

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_LoadIf 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、PageSort)中,請確保設置了 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
EditCommandEditItemIndex
PageIndexChangedCurrentPageIndex
SelectedIndexChanged?

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

Sub Page_Load
If Not ViewState("EditItemIndex") Is Nothing ThenDatagrid1.EditItemIndex = ViewState("EditItemIndex")End IfIf Not ViewState("CurrentPageIndex") Is Nothing ThenDatagrid1.CurrentPageIndex = ViewState("CurrentPageIndex")End IfBindGrid()
End SubSub BindGrid()Dim DV As DataViewDV = GetDataSource()DV.Sort = ViewState("SortExpression")Datagrid1.DataSource = DVDatagrid1.DataBind()
End SubSub Datagrid1_SortCommand(s As Object, _e As DataGridSortCommandEventArgs)ViewState("SortExpression") = e.SortExpressionBindGrid()
End SubSub Datagrid1_EditCommand(s As Object, _e As DatagridCommandEventArgs)Datagrid1.EditItemIndex = e.Item.ItemIndexViewState("EditItemIndex") = e.Item.ItemIndexBindGrid()
End SubSub Datagrid1_PageIndexChanged(s as Object, _e As DataGridPageChangedEventArgs)Datagrid1.CurrentPageIndex = e.NewPageIndexViewState("CurrentPageIndex") = e.NewPageIndexBindGrid()
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) ThenIf e.Item.DataItem("ForumDate") < DateTime.Today Then e.Item.Cells(1).BackColor = System.Drawing.Color.FromName("#ffccff")End IfEnd If
End Sub

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

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

總結

以上是生活随笔為你收集整理的常见 Datagrid 错误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久久国产精品毛片 | 国产精品成人一区二区三区电影毛片 | 亚洲www视频 | 国产8区 | 超碰成人久久 | 嫩草www| 2021天天操| 福利视频在线播放 | av大片在线播放 | 久久久com | 亚洲怡红院av | 亚洲综合久 | 久久久69 | 在线黄色网| 国产精品视频久久久 | 日本视频一区二区 | 色花av | 成年人福利 | 欧美日韩一区电影 | 91亚洲视频 | 91看视频 | 国产精品一区二区6 | 亚洲精美视频 | 成人黄色av网址 | 国产一级免费片 | 欧美美女视频 | 日本69熟 | 激情免费视频 | 亚洲熟妇国产熟妇肥婆 | 国产一区二区三区视频 | 欧美综合精品 | 蜜桃传媒一区二区亚洲av | 日本免费爱爱视频 | caopeng视频 | 亚洲成人欧美 | 欧美人xxx| 女futa攻玩遍整个后宫 | 青青青在线视频 | 国产亚洲精品女人久久久久久 | 少妇一级淫片免费观看 | 小罗莉极品一线天在线 | 海角社区id:1220.7126,10. | 国产又粗又猛又爽又黄的网站 | 亚洲国产欧洲 | 亚洲精品粉嫩小泬20p | 91福利片| 性――交――性――乱睡觉 | 久操社区| 国产色视频一区二区三区qq号 | 国产精品一区二区在线 | 欧美福利视频在线 | 91视频免费观看网站 | 亚洲不卡一区二区三区 | 男操女视频在线观看 | www.国产免费 | 国产精品第一国产精品 | av在线免费网站 | 国产精品99精品无码视 | 欧美精品综合 | 亚洲m码 欧洲s码sss222 | 日韩经典第一页 | 亚洲高清在线观看视频 | 成人黄色免费网址 | 天堂在线网 | 丁香婷婷深情五月亚洲 | 污网站免费看 | 成人网页 | 拔插拔插华人 | 久久久国产精品久久久 | 日本视频久久 | 免费av影视 | 欧美自拍偷拍一区 | 伊人91在线 | 国产伦精品一区二区三区照片91 | 九九久久免费视频 | 亚洲欧美日韩精品在线观看 | 91视频三区| 午夜免费精品 | 少妇人妻精品一区二区三区 | 日b视频免费看 | 波多野结衣之双调教hd | 国产免费一区二区三区 | 精品人妻午夜一区二区三区四区 | 佐山爱在线视频 | 蜜桃久久一区二区三区 | 久久久久久久久久影院 | 午夜手机福利 | 黄色av影视| 日本黄色三级 | 亚洲国产福利 | 91成人免费 | 中文字幕不卡视频 | 91日韩一区二区 | 91一区二区视频 | 在线视频 亚洲 | 成人aⅴ视频 | 自拍偷拍亚洲图片 | 精品视频久久久久久 | 国产尻逼视频 |