0

在 ascx.cs 文件中,我动态生成按钮。在 .aspx 文件中,我将控件添加到表单中。控件本身呈现良好,但是单击按钮时出现此错误

发生错误,因为无法找到 ID 为“ctl03”的控件,或者在回发后将不同的控件分配给了相同的 ID。

桌面控制.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);
    }
    }
}

默认.aspx.cs

DesktopControl desktop = new DesktopControl();
desktop.Build();
MainContent.Controls.Add(desktop);
4

2 回答 2

0

阅读评论后(很难阅读评论的代码部分),看起来是的,您正在生成您的控件if(!isPostBack){}; 好吧,看起来它是该声明的else一部分。if

每次页面回发时,您都必须生成控件,因为在单击page_load之前会触发控件。button因此,一旦重新创建控件,代码将继续到您的button单击处理程序,在那里控件应该可以处理。

从本质上讲,ReloadUI(Session["ui"]);删除if(!isPostBack){}else{}声明。把它放在你的if陈述之后。

像这样:

if (!isPostBack){

    // my first load code
}else{
   // my postback code
}

// load all my dynamic controls here
ReloadUI(Session["ui"]);
于 2012-12-18T19:58:39.287 回答
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)
    {

    }
}
于 2012-12-18T22:34:59.427 回答