簡體   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