先貼代碼:
protected void Page_Load(object sender, EventArgs e) { this.gvCon.MyBind+=new MyGridView.MyBind_Delegate(Bind); //這一句不用管 !,MyGridVIEw 的需要! if (Page.IsPostBack == false) { Bind(); } }
在 Bind 函數的動態綁定 編輯列。 當點 編輯時, 可以改變為 編輯樣式, 但是, 當點擊 Update 或 Cancel 時 , 數據丟失 !!這時, 我們采用的做法是 在 PageLoad 重新 Bind 一次!! 這就多Bind的了一次。 而且,在這一次Bind之後,會刷新頁面的值啊, 再 Update 時, 不是沒有效果了嗎!!還要在RowDataBound 函數裡加上
if (e.Row.RowIndex == this.gvTypeList.EditIndex) return;
麻煩, 這個問題也一直困擾著我很長時間。直到最近,決心把它搞下去。
方法一:如果用 AJax , 最高效的方式,就是在按鈕回發的時候,不要把整個控件放到 UpdatePanel 裡, 用 PageMethods 調用後台 WebMethod 所寫的方法(其實是 WebService),返回操作結果(要定義一些 XML 來約束 結果集)。這樣回發的負荷最少,適用於結果集數據量比較小和操作模式單一的情況。 但是對編程水平要求偏高。如果數據量大或操作模式復雜的話, 可回發,或讓 UpdatePanel 完成這個工作。
方法二:通過 Trace ,發現, Edit 的時候,__EVENTTARGET 變量為GridVIEw控件ID, __EVENTARGUMENT 變量為 命令$行索引。 而Update和 Cancel 兩個變量是沒有值 的, 我試著利用這一點,給動態創建的回發按鈕綁定腳本事件設置兩個變量,測試可行。這個方案應該是普遍受用的。
public string GetPostBackJS(string Command, int Index) { return string.Format(@"$('#__EVENTTARGET').val('{0}');$('#__EVENTARGUMENT').val('{1}');", this.UniqueID, Command + "$" + Index.ToString()); }
在創建按鈕的地方設置屬性:
editTc.Controls.Add(new ImageButton() { CommandName = CommandEnum.Cancel.ToString(), ImageUrl = this.CancelImgUrl, AlternateText = "取消" , OnClIEntClick= GetPostBackJS(CommandEnum.Cancel.ToString() , this.EditIndex ) });
OK。