2013-04-24 79 views
0

我得到一個非常奇怪的行爲與ASP.Net。 當我運行下面的代碼時,拋出異常「具有相同ID的多個控件」。 添加控件時不會拋出異常,但使用FindControl時。Asp.net FindControl +「具有相同ID的多個控件」

真正奇怪的是,如果我在調用之前放置一個斷點,並在拋出異常的直接窗口中運行FindControl調用(迄今爲止一致),但是當我恢復調試器時,一切正常( !)。機器運行相同的確切代碼,但它不會再次拋出異常。

關於這件瘋狂事情的​​最後一件事,今天早些時候,Page_Load內部的代碼非常相似,並且一切正常,但我重新組織了代碼並將其移至單獨的方法(由Page_Load調用)。 我得到非常有信心,這是一個ASP.Net的錯誤...

dlAdvanced.DataSource = dsAdvanced; 
    dlAdvanced.DataBind(); 

    // Load Advanced Values Controls 
    #region ADV controls 
    foreach (DataListItem dli in dlAdvanced.Items) 
    { 
     DataRow row = dsAdvanced.Tables[0].Rows[dli.ItemIndex]; 

     switch ((string)row["Type"]) 
     { 
      default: 
       TextBox tb = new TextBox(); 
       tb.ID = "Input"; 
       dli.FindControl("InputPlace").Controls.Add(tb); 
       break; 
      case "System.Int32": 
      case "System.Decimal": 
       TextBox tbn = new TextBox(); 
       tbn.ID = "Input"; 
       Image img = new Image(); 
       img.SkinID = "NumberRequired"; 
       img.ApplyStyleSheetSkin(this); 
       dli.FindControl("InputPlace").Controls.Add(tbn); 
       dli.FindControl("InputPlace").Controls.Add(img); // Exception happens here 
       break; 
      case "System.DateTime": 
       golf.golfControls.CalendarBox cal = new golf.golfControls.CalendarBox(); 
       cal.ID = "Input"; 
       cal.SkinID = "Calendar"; 
       cal.ApplyStyleSheetSkin(this); 
       dli.FindControl("InputPlace").Controls.Add(cal); 
       break; 
      case "System.Boolean": 
       RadioButton rb1 = new RadioButton(); 
       rb1.Text = "True"; 
       rb1.ID = "Input"; 
       rb1.GroupName = "grp" + dli.ItemIndex.ToString(); 
       RadioButton rb2 = new RadioButton(); 
       rb2.Text = "False"; 
       rb2.ID = "Input2"; 
       rb2.GroupName = "grp" + dli.ItemIndex.ToString(); 
       dli.FindControl("InputPlace").Controls.Add(rb1); 
       dli.FindControl("InputPlace").Controls.Add(rb2); 
       break; 
     } 
    } 
    #endregion 

編輯: 我雖然東西和它的工作:

 DataRow row = dsAdvanced.Tables[0].Rows[dli.ItemIndex]; 

     var inputPlace = dli.FindControl("InputPlace"); 

     switch ((string)row["Type"]) 
     { 
      default: 
       TextBox tb = new TextBox(); 
       tb.ID = "Input"; 
       inputPlace.Controls.Add(tb); 
       break; 
      case "System.Int32": 
      case "System.Decimal": 
       TextBox tbn = new TextBox(); 
       tbn.ID = "Input"; 
       Image img = new Image(); 
       img.SkinID = "NumberRequired"; 
       img.ApplyStyleSheetSkin(this); 
       inputPlace.Controls.Add(tbn); 
       inputPlace.Controls.Add(img); 
       break; 
      case "System.DateTime": 
       golf.golfControls.CalendarBox cal = new golf.golfControls.CalendarBox(); 
       cal.ID = "Input"; 
       cal.SkinID = "Calendar"; 
       cal.ApplyStyleSheetSkin(this); 
       inputPlace.Controls.Add(cal); 
       break; 
      case "System.Boolean": 
       RadioButton rb1 = new RadioButton(); 
       rb1.Text = "True"; 
       rb1.ID = "Input"; 
       rb1.GroupName = "grp" + dli.ItemIndex.ToString(); 
       RadioButton rb2 = new RadioButton(); 
       rb2.Text = "False"; 
       rb2.ID = "Input2"; 
       rb2.GroupName = "grp" + dli.ItemIndex.ToString(); 
       inputPlace.Controls.Add(rb1); 
       inputPlace.Controls.Add(rb2); 
       break; 
     } 

所以暫且,我的代碼工作正常,但這個問題沒有解決,所以如果有人知道這個bug的任何東西,請賜教。

+0

此外,我們不可能使用您現在發佈的代碼在我們的機器上重現您的錯誤。你有沒有機會寫一個能夠重現錯誤的小例子,但我們可以在我們自己的電腦上運行? – 2013-04-24 12:03:46

+0

@Thomas正如我所說,我不認爲我可以簡單地將這一小段代碼移到一個單獨的方法中,使得這個錯誤出現,所以如果我沒有誤認爲這個ASP.Net行爲是完全隨機的 – Serge 2013-04-24 12:12:31

+0

隨意比較帶有bug的代碼和沒有它的代碼,並猜測爲什麼dli.FindControl(「InputPlace」)在迭代中第一次被調用,第二次不工作,第三次再次工作(當我從我眼前的窗戶撥打第二個電話「欺騙」我)。 – Serge 2013-04-24 12:29:19

回答

0

它是不是一個錯誤,所有控件具有相同的ID tb.ID = "Input";cal.ID = "Input";

嘗試每個ID之後添加一個唯一的字符串像

tb.ID = "input" + dli.ItemIndex.ToString(); 
+0

我已經閱讀過,但這裏沒有關係。 這些控件不共享相同的命名容器,因此它們的UniqueID不相同。否則,新的代碼將無法工作(並且它也不會有效)。 – Serge 2013-04-24 14:44:37

0

這個問題實際上就爲試圖在代碼的其他地方再次添加這些控件。

我只是回答我自己的問題,所以這是一個封閉的問題,請不要憤怒downvote這種負責任的行爲。