[英]What's the difference in behavior between adding a control to an ASPX page directly, loading a control programmatically & adding to a placeholder?
在直接将控件添加到ASPX页面,以编程方式加载控件以及添加到占位符之间,行为上是否有区别?
该控件继承自System.Web.UI.WebControls.DataBoundControl
。
我问的原因是,当我将其添加到ASPX页面时,它具有一个可以正常工作的控件,如下所示:
...
<blah:GoogleMap ID="GoogleMap1" runat="server" Width="640px" Height="600px" ... DataSourceID="_odsMarkers" DataAddressField="Address" DataTextField="Description">
</blah:GoogleMap>
...
但是当我在代码隐藏页面中使用以下代码时却没有:
GoogleMap map = (GoogleMap)this.LoadControl(typeof(GoogleMap), new object[] { });
//... set properties
this.placeholder1.Controls.Add(map); //add to placeholder
任何人都知道为什么会这样吗?
如果在标记中定义或以编程方式添加,则控制树的结局相同。 但是,控制执行器在拧紧过程中仍有很大的空间。
您可以看看ASP.NET如何编译aspx:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
将控件添加到页面的时间可能是个问题。 通常的模式是将控件添加到CreateChildControls方法的重载中。 如果控件需要解析视图状态,则需要确保在初始化期间调用了该视图状态,例如,通过调用SecureChildControls。
增添了忍者的debugging提示。 如果以相同的方式添加标签,是否有任何区别。 它显示吗?
这是用户控件还是服务器控件?
如果是用户控件,则应按其路径而不是其类型加载它们:
GoogleMap map = (GoogleMap)this.LoadControl("~/Controls/GoogleMap.ascx");
如果是服务器控件,则只需新建一个实例:
GoogleMap map = new GoogleMap();
在拥有实例并将其添加到控件树(通过将其插入PlaceHolder中)之后,它的性能应与在标记中声明时的效果相同。
如果要在LoadControl调用之外设置属性,为什么要制作该新的空对象数组而不是仅使用具有一个参数的重载?
另外,如果将调试器附加到调试器并逐步执行,在进行Controls.Add()调用之前,您是否注意到有关该控件的任何奇怪信息? 是否抛出异常? 如果是这样,哪一个? 如果不是,占位符在浏览器中的标记是什么样的?
“ Works”有点模棱两可,但是,如果您的意思是永远不会执行事件处理程序,则需要在页面onload事件中加载它。
如果控件要求使用viewstate,则必须确保在Page_Load事件之前将其添加到页面中,否则将不会填充viewstate,并且最有可能的事件和其他项目将无法正常运行。
一个重要的区别是,如果动态创建控件,则默认情况下,不会从外观集中获得任何值。 您必须手动调用control.ApplyStyleSheetSkin(page): http : //msdn.microsoft.com/en-us/library/system.web.ui.control.applystylesheetskin.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.