我继承了一个ASP.NET应用程序,它有一个页面,其中UserControls动态添加到面板(或ContentPlaceHolder),每个UserControl有几个控件来显示信息,一个RadioButtonList接受用户输入。表单和数据库更新的验证是从main.aspx页面上的提交按钮触发的,该页面包含带有控件的面板。这绝对没问题。
所以我通过复制代码/逻辑并修改它来将这个想法复制到另一个页面(作为包含不同控件的不同ascx),因为这是我知道如何添加可变数量的控件的唯一方法(每个控件都有标题,显示一些信息,并有一个用于用户输入的CheckBox。)
新的UserControls被添加到页面中,当我尝试使用下面的代码引用它们时出现问题。此代码从“提交”按钮触发。它失败是因为面板对象不包含任何控件,尽管我测试时它们在网页上显示!
protected void GetInformationSelected()
{
int numRecs = 0;
foreach (Control c in pnlInfo.Controls) // this is the problem as no controls are detected inside the panel
{
try
{
string x = c.GetType().ToString();
if (x == "ASP.ctlInfo_ascx")
{
if (((ctlInfo)c) != null)
{
numRecs = numRecs + ((ctlInfo)c).getSelected(); // this will read the value from the control
}
}
}
catch (System.Exception err)
{
Response.Write(err.Message);
}
}
}
我确信需要更多信息来描述问题,我很乐意发布其他所需的信息。
以下是我如何将控件添加到Panel中。有趣的是,使用this.FindControl("pnlInfo").Controls.Add(c1);
不能像在其他页面中那样工作,而是我只使用了pnlInfo.Controls.Add(c1);
foreach (DataRow dr in dt.Rows)
{
ctlInfo c1 = (ctlInfo)this.LoadControl("~\\ctlInfo.ascx");
c1.Init(Int32.Parse(dr[0].ToString()), dr[1].ToString(), dr[2].ToString(), dr[3].ToString()); // *** need to check the columns in the data set
pnlInfo.Controls.Add(c1);
//this.FindControl("pnlInfo").Controls.Add(c1); This is how the previous example added the controls, note the subtle difference
}
非常感谢任何指导,所以提前感谢。下面我将显示网页中显示的内容,其中包含屏幕右侧5个用户控件的违规面板。请注意,始终显示产品信息(即添加第一个UserControl),但根据实验的随机组件,可能会显示0到4个额外的信息位: