无法识别usercontrol中动态创建的控件

时间:2012-12-18 19:10:23

标签: asp.net

在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);

2 个答案:

答案 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)
    {

    }
}