我正在为数据阅读器中提取的每条记录添加一个用户控件,这是基本循环:
while (dr.Read())
{
ImageSelect imgSel = new ImageSelect(dr["Name"].ToString());
myPanel.Controls.Add(imgSel);
}
问题是页面没有添加任何控件,我查看了html输出,并且有我的面板,其中没有任何内容。
我甚至逐步调试了调试器中的代码,并验证myPanel.Controls在每个循环中都添加了一个控件,计数为6,没有错误,但是它们没有显示在页面上。
我在Page_Init和Page_Load事件中运行了上述代码,两者都有相同的结果。
修改 好的,我已经切换到使用LoadControl(“.... ascx”)来获取我的控件实例,现在正在运行。但最初我也是通过控件构造函数传递数据..这仍然可行或者我只需要通过get / sets设置它们吗?
编辑2: 感谢Freddy指出LoadControl有一个重载,您可以在其中传递构造函数参数,请参阅接受的答案。
编辑3: 在使用和不使用构造函数的情况下尝试此方法之后。我发现最好只使用setter来获取我希望控件拥有的任何属性,而不是尝试使用传入的对象数组作为构造函数。
答案 0 :(得分:4)
更新:正如Steve指出的那样,使用该类型的LoadControl的重载将不会考虑ascx中的控件。这个答案中也提到了这一点:Dynamically Loading a UserControl with LoadControl Method (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" %>
聚苯乙烯。我通常使用set / get for controls,因为我发现它们更符合asp.net模型
答案 1 :(得分:3)
要添加UserControl,必须调用LoadControl方法传递.ascx文件的路径。您无法通过实例化.ascx文件继承的对象来创建它们。
UserControl包含后面代码中的标记和类。标记包含后面的类的链接,但后面的类不知道标记的位置,因此不能自己创建。