我有一个用户控件(ucMarket),它包含(为简单起见)两个控件:ListBox(ucListBox)和Label(ucLabel)。我需要动态地在页面上创建该用户控件的多个实例(取决于DataSet的结果),并使用foreach语句和以下内容添加它们:
Panel1.Controls.Add(ucMarket1);
但是如何访问像Rows这样的ListBox属性?到目前为止我唯一发现的是将控件转换为ListBox:
ListBox listBox1 = (ListBox)ucMarket1.FindControl("ucListBox");
listBox1.Rows = 10;
对于Label部分,我想我也可以做类似的事情:
label1 = (Label)ucMarket1.FindControl("ucLabel");
但是,如何将这些信息反馈给用户控件?有没有办法直接使用用户控件而不是强制转换?
答案 0 :(得分:2)
好几件事。从命名约定的角度来看,不要称之为标签&列表框,ucSOMETHING。这是非常令人困惑的,并且从您的示例中不清楚您是指代asp:Label控件还是您编写的一些自定义userControl。至于访问你的控件。
我假设您正在以下列方式创建和添加一堆用户控件。
for(int i = 0; i < 5; i++)
{
var control = Page.LoadControl("~/Path/To/ucMarket.ascx");
control.Id = "ucMarket" + i;
Panel1.Controls.Add(control);
}
因此,最好的办法是将Control上的Listbox公开为公共财产。
public class ucMarket : UserControl
{
public ListBox TheListBox
{
get { return ucListBox; }
}
}
这样你就可以通过以下方式访问你的列表框了。
var ctrl = Panel1.FindControl("ucMarket1") as ucMarket;
ctrl.TheListBox.Rows ;