[英]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.