網頁

2011年6月22日 星期三

Asp.net GridView Binding Time

Last Update: 2011/06/22 16:17+08

Intro

綁定時機算是挺重要的, 相信大家在寫GridView都曾遇到過
(1) Edit mode 指定到上一次的Row.
(2) 可能有部份人會遇到, 在Page_Load裡做綁定的動作, RowCommand 會壞掉
咱也曾經歷過
咱最近又常trace到這類的Code
咱決定閒來沒事寫給各位看倌們參考
請在 Page_PreRender 執行 this.DataBind()

Content

這是咱們的GridView
<asp:GridView ID="gvList" runat="server" OnRowEditing="gvList_RowEditing">
  <Columns><asp:TemplateField>
    <ItemTemplate>
      <asp:Button ID="btnEdit" runat="server" CommandName="Edit" />
    </ItemTemplate>
  </asp:TemplateField></Columns>
</asp:GridView>
這是咱們的Code
protected void Page_Load(object sender, EventArgs e){
    //if (IsPostBack) { return; }//*3
    var item = new[]{ 
            new { id = "i001", name="John"},
            new { id = "i002", name="Merry"},
            new { id = "i003", name="Ellin"}
        };
    gvList.DataSource = item;
    gvList.DataBind();//*1
}

protected void gvList_RowEditing(object sender, GridViewEditEventArgs e){
    gvList.EditIndex = e.NewEditIndex;
    gvList.DataBind();//*2
    Response.Write(e.NewEditIndex);
}
protected void Page_PreRender(object sender, EventArgs e){
    //this.DataBind();//*4
}
剛開始, 習慣上
咱過去也是會在指定完 DataSource 後, 直接執行DataBind() ---(*1)
但是就會遇到第一個問題
a. 在gvList_RowEditing 指定完 GridView.EditIndex, 頁面總是顯示上一次點擊的Row
相信大家早已知道解決方法: 在指定完後 Bind ---(*2)

再來
b. 傳說中 "無效的回傳或回呼引數" 就出現了
當然在請教咱們偉大的古狗大神, 一下就得到了解答
RowEditing事件, 在重新綁定後, 原本的Row就消失了
所以加入了 ispostback 判斷 ---(*3)

再來
c. postback沒有指定DataSource, 資料就消失了, 那就合併 (*1) 跟 (*3) ...

還有啥問題盡管來吧!! 醬的感想就出來了!!
不不不, 其實 DataBind 不是醬用的!!!
如果指定完 DataSource 就 Bind
那咱們要 DataBind 這樣的 function 有啥用
是不是想到啥東西了XD
對, 就是在 Render 以前綁定就可以了, 也就是 PreRender
而 this.DataBind(), 會幫你把所有子控制項都執行DataBind()
好了, 把 (*1)、(*2)、(*3) 都拿掉吧!!
解除(*4)的封印註解!!!
啊, 這可不是通用法則

沒有留言:

張貼留言