[英]How do I dynamically create/remove controls, with EventHandlers, to/from an ASP.NET page?
在我的一個項目中,我需要構建一個ASP.NET頁面,並且需要動態創建一些控件。 這些控件由代碼隱藏類添加到頁面中,並且它們添加了一些事件處理程序。 在PostBacks上,這些事件處理程序與頁面上顯示的控件有很大關系。 簡而言之,這對我不起作用,我似乎無法弄清楚這一點。
所以,由於我的項目非常復雜,我決定創建一個不起作用的簡短示例,但是如果你可以調整它以使它工作,那將是很好的,然后我就可以將你的解決方案應用到我原來的問題。
以下示例應在面板上動態創建三個按鈕。 按下其中一個按鈕時,除了按下的按鈕外,應動態重新創建所有按鈕。 換句話說,只需隱藏用戶按下的按鈕並顯示另外兩個按鈕。
為了使您的解決方案有所幫助,您無法靜態創建按鈕,然后使用Visible屬性(或以其他方式徹底更改示例) - 您必須在每個PostBack上動態地重新創建所有按鈕控件(不一定在事件處理程序雖然)。 這不是一個棘手的問題 - 我真的不知道該怎么做。 非常感謝您的努力。 這是我的簡短例子:
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="ButtonsPanel" runat="server"></asp:Panel>
</div>
</form>
</body>
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.