繁体   English   中英

在直接将控件添加到ASPX页面,以编程方式加载控件以及添加到占位符之间,行为上有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM