在ascx.cs文件中,我正在动态生成按钮。在.aspx文件中,我将控件添加到表单中。控件本身渲染效果很好,但单击按钮时出现此错误
发生错误,因为id为“ctl03”的控件无法执行 找到位置或不同的控件后分配给相同的ID 回发。
DestopControl.ascx.cs
public partial class DesktopControl : PlaceHolder
{
public void Build()
{
for (int i = 0; i < 10; i++)
{
Button button = new Button()
{
Width = 50,
Height = 50,
ID = string.Format("button{0}", i),
Text = i.ToString()
};
button.Click+=new EventHandler(button_Click);
}
}
}
Default.aspx.cs
DesktopControl desktop = new DesktopControl();
desktop.Build();
MainContent.Controls.Add(desktop);
答案 0 :(得分:0)
阅读评论后(很难阅读评论的代码部分)似乎是的,您在if(!isPostBack){}
内生成控件;好吧,看起来像是else
声明的if
部分。
每次页面回发时都必须生成控件,因为在page_load
点击之前button
被触发了。因此,一旦重新创建了控件,代码将继续运行到button
单击处理程序,其中控件应该可以处理。
基本上,从ReloadUI(Session["ui"]);
语句中取出if(!isPostBack){}else{}
OUT。把它放在if
陈述之后。
像这样:
if (!isPostBack){
// my first load code
}else{
// my postback code
}
// load all my dynamic controls here
ReloadUI(Session["ui"]);
答案 1 :(得分:0)
找到解决方案:
每次有新的UI我都会调用这个ClearScreen()来实现这个技巧。 'ctl03'上的错误是一个菜单控件,它正在生成它自己的ID,并且在回发时无法显示。我为它分配了一个ID。但我猜这个问题随着ClearScreen()方法而消失了。
private void ClearScreen()
{
try
{
List<Control> controls = new List<Control>();
foreach (Control control in MainContent.Controls)
{
controls.Add(control);
}
for (int i = 0; i < controls.Count; i++)
{
if (!(controls[i].GetType() == typeof(LiteralControl) || controls[i].GetType() == typeof(ScriptManager)))
{
MainContent.Controls.Remove(controls[i]);
}
}
}
catch (Exception ex)
{
}
}