无法动态地向页面添加控件
我正在为数据读取器中提取的每条记录添加一个用户控件,这是基本循环:
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包含后面代码中的标记和类。 标记包含指向后面的类的链接,但后面的类不知道标记的位置,因此无法在其自身上创建。
上述就是C#学习教程:无法动态地向页面添加控件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1002690.html