簡體   English   中英

如何使用EventHandler動態創建/刪除ASP.NET頁面的控件?

[英]How do I dynamically create/remove controls, with EventHandlers, to/from an ASP.NET page?

在我的一個項目中,我需要構建一個ASP.NET頁面,並且需要動態創建一些控件。 這些控件由代碼隱藏類添加到頁面中,並且它們添加了一些事件處理程序。 在PostBacks上,這些事件處理程序與頁面上顯示的控件有很大關系。 簡而言之,這對我不起作用,我似乎無法弄清楚這一點。

所以,由於我的項目非常復雜,我決定創建一個不起作用的簡短示例,但是如果你可以調整它以使它工作,那將是很好的,然后我就可以將你的解決方案應用到我原來的問題。

以下示例應在面板上動態創建三個按鈕。 按下其中一個按鈕時,除了按下的按鈕外,應動態重新創建所有按鈕。 換句話說,只需隱藏用戶按下的按鈕並顯示另外兩個按鈕。

為了使您的解決方案有所幫助,您無法靜態創建按鈕,然后使用Visible屬性(或以其他方式徹底更改示例) - 您必須在每個PostBack上動態地重新創建所有按鈕控件(不一定在事件處理程序雖然)。 這不是一個棘手的問題 - 我真的不知道該怎么做。 非常感謝您的努力。 這是我的簡短例子:

從Default.aspx文件:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel ID="ButtonsPanel" runat="server"></asp:Panel>
    </div>
    </form>
</body>

從Default.aspx.cs代碼隱藏文件:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DynamicControls
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            AddButtons();
        }

        protected void AddButtons()
        {
            var lastClick = (string) Session["ClickedButton"] ?? "";

            ButtonsPanel.Controls.Clear();
            if (!lastClick.Equals("1")) AddButtonControl("1");
            if (!lastClick.Equals("2")) AddButtonControl("2");
            if (!lastClick.Equals("3")) AddButtonControl("3");
        }

        protected void AddButtonControl(String id)
        {
            var button = new Button {Text = id};
            button.Click += button_Click;
            ButtonsPanel.Controls.Add(button);
        }

        private void button_Click(object sender, EventArgs e)
        {
            Session["ClickedButton"] = ((Button) sender).Text;
            AddButtons();
        }
    }
}

我的示例顯示了三個按鈕,當我單擊其中一個按鈕時,按下的按鈕將被隱藏。 似乎工作; 但是在第一次點擊之后,我必須點擊每個按鈕TWICE才能隱藏它。 !?

我認為你必須在每次添加它們時為你的按鈕提供相同的ID,例如(在AddButtonControl方法的第一行):

var button = new Button { Text = id , ID = id };

編輯 - 我的解決方案沒有使用會話:

public partial class _Default : Page
{
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        AddButtons();
    }

    protected void AddButtons()
    {
        AddButtonControl("btn1", "1");
        AddButtonControl("btn2", "2");
        AddButtonControl("btn3", "3");
    }

    protected void AddButtonControl(string id, string text)
    {
        var button = new Button { Text = text, ID = id };
        button.Click += button_Click;
        ButtonsPanel.Controls.Add(button);
    }

    private void button_Click(object sender, EventArgs e)
    {
        foreach (Control control in ButtonsPanel.Controls)
            control.Visible = !control.Equals(sender);
    }
}

您需要確保在Pre_Init事件期間添加動態控件。

請參閱此處了解ASP.NET頁面生命周期: http//msdn.microsoft.com/en-us/library/ms178472.aspx

添加事件時,您需要在不晚於Page_Load方法的情況下執行此操作,並且需要在每個請求中添加它們,即您永遠不應將事件分配包裝在!IsPostBack

您還需要創建單個請求的動態控件。 ViewState不會代表您處理娛樂活動。

我注意到的一件事是,當您單擊一個按鈕時,您將調用AddButtons()兩次,一次在Page_Load() ,一次在button_Click()方法中。 您應該將Page_Load()中的一個包裝在if (!IsPostBack)塊中。

if (!IsPostBack)
{
   AddButtons();
}

AFAIK,控件的創建不應放在Page_Load中,而應放在Page_PreInit中(ViewState和SessionState在Page_Load之前但在Page_PreInit之后加載)。

有了你的問題,我建議調試AddButtons函數,找出在Session [“ClickedButton”]中存儲的確切內容(和時間)。 然后,你應該能夠找出問題所在。

動態添加的控件不會被緩存,因此這會將我的一個問題轉移給我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM