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)的
啊, 這可不是通用法則
沒有留言:
張貼留言