在我的一个项目中,我需要构建一个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 才能隐藏它。 !?
答案 0 :(得分:3)
我认为每次添加按钮时都必须为按钮提供相同的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);
}
}
答案 1 :(得分:3)
您需要确保在Pre_Init
事件期间添加动态控件。
请参阅此处了解ASP.NET页面生命周期:http://msdn.microsoft.com/en-us/library/ms178472.aspx
添加事件时,您需要在Page_Load
方法之前执行此操作,并且每个请求都需要添加 ,即您永远不应将事件分配包装在{{1 }}
您还需要创建单个请求的动态控件。 ViewState不会代表您处理娱乐活动。
答案 2 :(得分:1)
我注意到的一点是,当您单击按钮时,您将调用AddButtons()两次,一次在Page_Load()
中,一次在button_Click()
方法中。您应该将Page_Load()
中的那个包裹在if (!IsPostBack)
块中。
if (!IsPostBack)
{
AddButtons();
}
答案 3 :(得分:0)
AFAIK,创建控件不应该放在Page_Load中,而应放在Page_PreInit中(ViewState和SessionState在Page_Load之前但在Page_PreInit之后加载)。
考虑到你的问题,我建议调试AddButtons函数,找出Session [“ClickedButton”]中存储的确切内容(和时间)。然后,你应该能够找出问题。
答案 4 :(得分:0)
动态添加的控件不会被缓存,因此这会让我遇到您的一个问题