无法动态地向页面添加控件

我正在为数据读取器中提取的每条记录添加一个用户控件,这是基本循环:

while (dr.Read()) { ImageSelect imgSel = new ImageSelect(dr["Name"].ToString()); myPanel.Controls.Add(imgSel); } 

问题是没有控件添加到页面,我检查html输出,并有我的面板,其中没有任何内容。

我甚至逐步调试了调试器中的代码,并validationmyPanel.Controls在每个循环中都添加了一个控件,计数为6,没有错误,但是它们不会显示在页面上。

我在Page_Init和Page_Load事件中运行上面的代码,两者都有相同的结果。

编辑:好的所以我已经切换到使用LoadControl(“…. ascx”)来获取我的控件实例,现在正在运行。 但最初我也是通过控件构造函数传递数据..这仍然可行或者我只需要通过get / sets设置它们吗?

编辑2:感谢Freddy指出LoadControl有一个过载,你可以传递构造函数参数,请参阅接受的答案。

编辑3:使用和不使用构造函数尝试此方法。 我发现最好只使用setter来获取我希望控件拥有的任何属性,而不是尝试将传入的对象数组用于构造函数。

更新:正如史蒂夫指出的那样,使用该类型的LoadControl的重载将不会考虑ascx中的控件。 这个答案中也提到了这一点: 使用LoadControl方法动态加载UserControl(Type,object []) 。

正如我之前提到的,get / set更符合asp.net模型,所以我建议使用带有接收用户控制路径的LoadControl变体。 也就是说,史蒂夫的版本是一个有趣的选择: http : //www.grumpydev.com/2009/01/05/passing-parameters-using-loadcontrol/ 。

我的看法是LoadControl类型与Web自定义控件一起使用。


如果它是用户控件,则应使用LoadControl(usercontrolpath)来获取用户控件的实例。

你可以通过这样做来使用构造函数:

 var name = dr["Name"].ToString(); var imgSel = LoadControl(typeof(ImageSelect), new object[]{ name }); myPanel.Controls.Add(imgSel); 

请注意,根据您使用的项目模型,您需要添加对aspx的引用以将其与变体类型一起使用:

 <%@ Reference Control="~/somepath/myusercontrol.ascx" %> 

PS。 我通常使用set / get for controls,因为我发现它们更符合asp.net模型

要添加UserControl,必须调用LoadControl方法传递.ascx文件的路径。 您无法通过实例化.ascx文件inheritance的对象来创建它们。

UserControl包含后面代码中的标记和类。 标记包含指向后面的类的链接,但后面的类不知道标记的位置,因此无法在其自身上创建。