0

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);
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 に答える