close
大家都知道如何使用UpdatePanel,這邊就不贅述
某些情況之下可能需要動態產生非常多的Button及其事件
但這些Button若沒有加入到UpdatePanel的Trigger中,則必定會產生Postback
這對我而言造成了一些困擾
一個簡單的範例告訴大家如何動態地加入許多Trigger以避免Postback發生
前端:
<td >
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel id="UpdatePanel1" UpdateMode="Conditional" ScrollBars="Auto" runat="server" width="100%" height='870'>
<ContentTemplate>
<label id="lbRecode" runat="server" style="font-size: large; font-style: normal; font-family: "Microsoft YaHei""></label> </ContentTemplate>
</asp:UpdatePanel>
</td>
在某個table中的td加入原件ScriptManager 與 UpdatePanel
後端:
protected void constuctUser()
{
DataTable dtExamniner = new DataTable();
dtExamniner = getAllExaminer();
if (dtExamniner.Rows.Count > 0)
{
for (int i = 0; i < dtExamniner.Rows.Count; i++)
{
tbExaminerTable.ID = "tbExaminerTable";
TableRow trUserData = new TableRow();
TableCell tcUserData = new TableCell();
//動態產生Button
Button btnExaminer = new Button();
btnExaminer.ID = "btExaminer_" + dtExamniner.Rows[i]["UserID"].ToString();
btnExaminer.Text = dtExamniner.Rows[i]["userName"].ToString();
bExaminer.Click += new EventHandler(btnExaminer_Click);
//動態產生Trigger
AsyncPostBackTrigger tLoading = new AsyncPostBackTrigger();
tLoading.ControlID = btnExaminer.ID; //要偵測的物件ID
tLoading.EventName = "Click"; //Button的觸發事件為Click
UpdatePanel1.Triggers.Add(tLoading);
UpdatePanel1.Update();
trUserData.Controls.Add(tcUserData);
tcUserData.Controls.Add(btnExaminer);
tbExaminerTable.Controls.Add(trUserData);
ExaminerTablePanel.Controls.Add(tbExaminerTable);
}
}
}
這段重點在於動態產生一定數量的Button及其事件,還有動態產生Trigger,其餘的皆為將物件加入表格中或是排版
**但此方法可能經常造成Trigger掉了**
解決方法是
請在PageLoad中加入,讓他重新連接Trigger
if (this.ScriptManager1.IsInAsyncPostBack)
{
UpdatePanel1.GetType().GetMethod("Initialize", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(UpdatePanel1, null);
}
文章標籤
全站熱搜