[英]UpdatePanel and dynamically generated controls
我試圖在updatepanel內部動態構建控件列表,並從所述控件列表上的按鈕觸發事件。
但是,當我單擊生成的控件時,我的頁面執行了回發操作,而不是實際觸發觸發器,並且從未達到我期望的斷點,而是僅觸發了頁面加載/頁面初始化事件。
我想念什么?
Default.aspx的
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:Button ID="add" Text="add" runat="server" OnClick="add_Click"/>
<asp:updatepanel runat="server" id="test" ChildrenAsTriggers ="false" UpdateMode="Conditional">
<ContentTemplate></ContentTemplate>
</asp:updatepanel>
</asp:Content>
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Test
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void add_Click(object sender, EventArgs e)
{
var container = test.ContentTemplateContainer;
container.Controls.Clear();
Literal literal = new Literal();
literal.Text = DateTime.Now.ToString();
literal.ID = DateTime.Now.Ticks.ToString();
container.Controls.Add(literal);
Button btn = new Button();
btn.Text = "123";
btn.Click += new EventHandler(btnClick);
container.Controls.Add(btn);
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = btn.UniqueID;
trigger.EventName = "Click";
test.Triggers.Add(trigger);
}
protected void btnClick(object sender, EventArgs e) {
System.Diagnostics.Debugger.Break(); //never gets hit
var abc = 16;
}
}
}
該按鈕永遠不會點擊btnClick
因為該按鈕不存在。 您是在按鈕單擊事件上創建按鈕的,但是在回發中丟失了。
必須始終為Page_Load事件處理程序中的每個PostBack操作再次添加動態添加的控件,否則它們將從頁面中消失。 但是由於您使用的是UpdatePanel,因此看起來它們仍然存在。
在下面嘗試此操作,您將看到這次單擊按鈕確實起作用。
protected void Page_Load(object sender, EventArgs e)
{
var container = testje.ContentTemplateContainer;
container.Controls.Clear();
Button btn = new Button();
btn.Text = "123";
btn.Click += new EventHandler(btnClick);
container.Controls.Add(btn);
}
如果要使用add_Click
添加一組以上的文字和按鈕, add_Click
需要將點擊次數存儲在ViewState
並創建一個在頁面重新加載時在ViewState中循環計數的函數。
這里是一個如何工作的例子。
//declare global integer
int controlCount = 0;
protected void Page_Load(object sender, EventArgs e)
{
//check if the viewstate exists
if (ViewState["controlCount"] != null)
{
try
{
//convert viewstate to int
controlCount = Convert.ToInt32(ViewState["controlCount"]);
}
catch
{
}
}
//call the funcion to add the controls on every page load
addControls();
}
protected void add_Click(object sender, EventArgs e)
{
//pretty obvious what this does...
controlCount++;
addControls();
}
private void addControls()
{
var container = testje.ContentTemplateContainer;
container.Controls.Clear();
//loop the currect control count
for (int i = 0; i < controlCount; i++)
{
Literal literal = new Literal();
literal.Text = "Literal " + i;
literal.ID = "myLiteral_" + i;
container.Controls.Add(literal);
Button btn = new Button();
btn.Text = "Button " + i;
btn.ID = "myButton_" + i;
btn.Click += new EventHandler(btnClick);
container.Controls.Add(btn);
}
//set the viewstate again with the new control count
ViewState["controlCount"] = controlCount;
}
protected void btnClick(object sender, EventArgs e)
{
//cast the sender as a button
Button btn = sender as Button;
//split the ID to get the count
string [] btnNr = btn.ID.Split('_');
//find the literal that goes with the clicked button
Literal literal = testje.FindControl("myLiteral_" + btnNr[1]) as Literal;
//alert the literal text
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "doPopup", "alert('" + literal.Text + "')", true);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.