網頁

2011年6月27日 星期一

Asp.net View & Edit Mode on Control

Last Update: 2011/06/27 17:11+08

Intro


廢話少說XD,網頁就是要不斷 Add/Edit/View...
明明同一個Layout為何要做一個編輯, 一個檢視咧.
基於這個想法, 就試著做一個切換方式吧!!
重點在 override Render


Summary


1. 建一個interface IViewEditControl 讓控制項有共同 function
2. 繼承原生控制項, 實作咱們的interface, 並覆寫Render
3. 切換模式吧!!


Context



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)的封印註解!!!
啊, 這可不是通用法則

2011年6月16日 星期四

Asp.net Button PostBack use OnClientClick

Last Update: 2011/06/22 16:08+08
更新~ 加入ValidationGroup

Intro


目標是
1. Confirm before PostBack
2. Validator working

Context


這大概沒啥技術性, 就是要找怎麼用
重點在
GetPostBackEventReference: 取得PostBack函式
Page_ClientValidate(string ValidationGroup): 執行頁面驗證, 會回傳成功與否
Page_IsValid: 驗證狀態 (這大概是個Flag可以不用)

根據這些去拼出 JavaScript
最後的 return false 是避免自動PostBack
不知道誰呼叫了 onclick, 如果沒回傳false仍舊會PostBack


public static void ClickSendValidConfirmDisabled(System.Web.UI.Page page, System.Web.UI.WebControls.WebControl ctrl, string confirmText){
 string clientScript = ctrl.ClientID + ".disabled='disabled';" + page.ClientScript.GetPostBackEventReference(ctrl, null) + ";";

 bool needValid = false;
 string validationGroup = null;
 if (ctrl is System.Web.UI.WebControls.IButtonControl){
  System.Web.UI.WebControls.IButtonControl ibtnCtrl = ctrl as System.Web.UI.WebControls.IButtonControl;
  needValid = ibtnCtrl.CausesValidation;
  validationGroup = ibtnCtrl.ValidationGroup;
 }

 clientScript = "if(confirm('" + confirmText + "')){" + clientScript + "}";

 if (needValid){ clientScript = "if(Page_ClientValidate('" + validationGroup + "')){" + clientScript + "}"; }

 ctrl.Attributes["onclick"] = clientScript + "return false;";
}