我得到一個非常奇怪的行爲與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的任何東西,請賜教。
此外,我們不可能使用您現在發佈的代碼在我們的機器上重現您的錯誤。你有沒有機會寫一個能夠重現錯誤的小例子,但我們可以在我們自己的電腦上運行? – 2013-04-24 12:03:46
@Thomas正如我所說,我不認爲我可以簡單地將這一小段代碼移到一個單獨的方法中,使得這個錯誤出現,所以如果我沒有誤認爲這個ASP.Net行爲是完全隨機的 – Serge 2013-04-24 12:12:31
隨意比較帶有bug的代碼和沒有它的代碼,並猜測爲什麼dli.FindControl(「InputPlace」)在迭代中第一次被調用,第二次不工作,第三次再次工作(當我從我眼前的窗戶撥打第二個電話「欺騙」我)。 – Serge 2013-04-24 12:29:19