繁体   English   中英

UpdatePanel和动态生成的控件

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM