2012-12-18 20 views
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); 
+1

你有你的Default.aspx代碼(如上所示)在一個'if(!isPostBack){}'裏面嗎?如果是的話,把它從那裏拿出來。 – Darren

+0

另外 - 什麼是'ctl03' - 這看起來不是你的代碼中的一個ID - 它們會是'button1'等 – Darren

+0

我的項目中的一切都是動態創建的控件。第一次在Page_Load事件中,If(!isPostBack){ShowLoginPage(); }其他{ReloadUI(Session [「ui」]); }。 基本上,我調用了一個返回UI定義的wcf服務。我根據定義和form1.Controls.Add(control)生成控件。 登錄後,WCF發送'桌面'作爲用戶界面,我實例化這個'DesktopControl'並將其添加到form1.Controls.Add(桌面)。但登錄用戶界面停留在那裏。我不知道如何在渲染新的UI之前清除屏幕。 – gangt

回答

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

    } 
} 
0

閱讀評論(有點難以閱讀評論的代碼部分)之後,似乎是的,你在if(!isPostBack){}內生成你的控件;好吧,看起來像是在if聲明的else部分。

您必須在每次回覆頁面時生成控件,因爲page_load在您點擊button之前被觸發。因此,一旦控件重新創建,代碼將繼續到您的button點擊處理程序,控件應該可以處理。

本質上,採取ReloadUI(Session["ui"]); OUT的if(!isPostBack){}else{}聲明。把它放在你的if聲明之後。

像這樣:

if (!isPostBack){ 

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

// load all my dynamic controls here 
ReloadUI(Session["ui"]); 
+0

我做到了,但仍然是一樣的。我添加了一個截圖到我原來的帖子。你可以看到登錄控制仍然停留在那裏,它應該被清除,並且新的UI應該被渲染。這個模型最初是爲silverlight而設計的,它可以正常工作。我需要在asp.net中重現它。 – gangt

+0

不要以爲我可以幫助了......必須有比你所顯示的代碼更多的代碼,這是干擾的。您需要找出設置爲ctl03的內容 - 可能需要查看該ID的HTML源代碼。 – Darren

+0

我找到了解決方案並回答了我自己的問題。 – gangt