動態建立 GridView 編輯欄位時,點擊編輯可正常切換模式,但點擊 Update 或 Cancel 導致資料遺失。常見做法在 Page_Load 重新 Bind(),但會造成多餘綁定與資料衝突。
將操作寫成 WebMethod (實際上是 Web Service),透過 PageMethods 呼叫,僅傳輸結果資料(XML/JSON),減少回發負載。適用於資料量小、操作單一情境,但對程式設計能力要求較高。
透過 Trace 發現:
- Edit 時:__EVENTTARGET = GridView ID,__EVENTARGUMENT = "命令$行索引"
- Update/Cancel 時:兩變數皆無值
解法:在動態建立的按鈕 OnClientClick 注入腳本,手動設定這兩個隱藏欄位:
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)
});
此法相容性佳,可解決動態欄位回發事件失效問題。