将控件直接添加到ASPX页面,以编程方式加载控件之间的行为差​​异是什么?添加到占位符?

时间:2008-12-01 18:01:41

标签: asp.net controls

直接向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

任何人都有任何想法为什么会出现这种情况?

6 个答案:

答案 0 :(得分:3)

如果您在标记中定义或以编程方式添加,控制树将以相同的方式结束。但是,控制实施者还有很大的空间可以随时搞定。

你可以看看ASP.NET如何编译aspx:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

将控件添加到页面的时间可能是个问题。通常的模式是在CreateChildControls方法的重载中添加控件。如果控件需要解析viewstate,则需要确保在init期间调用它,例如通过调用EnsureChildControls。

添加忍者的诽谤暗示。如果以相同的方式添加标签,它会有什么不同吗?它出现了吗?

答案 1 :(得分:2)

这是用户控件还是服务器控件?

如果是用户控件,则应按路径加载,而不是类型:

GoogleMap map = (GoogleMap)this.LoadControl("~/Controls/GoogleMap.ascx");

如果是服务器控制,那么你可以新建一个实例:

GoogleMap map = new GoogleMap();

获得实例并将其添加到控制树(通过将其插入PlaceHolder)后,它应该执行与在标记中声明时相同的操作。

答案 2 :(得分:1)

如果要在LoadControl调用之外设置属性,为什么要创建新的空对象数组而不是仅使用具有一个参数的重载?

另外,如果您将调试器附加到它并单步执行,在进行Controls.Add()调用之前,您是否注意到有关控件的任何奇怪之处?是否有抛出异常?如果是的话,哪一个?如果没有,浏览器中的标记对于占位符的位置是什么样的?

答案 3 :(得分:1)

“Works”有点含糊不清,但如果你的意思是,事件处理程序永远不会被执行,你需要在页面onload事件中加载它。

答案 4 :(得分:1)

如果控件需要使用viewstate,则必须确保在Page_Load事件之前将其添加到页面中,否则将不会填充viewstate,并且很可能事件和其他项目将无法正常运行。

答案 5 :(得分:0)

一个重要的区别是,如果您动态创建控件,默认情况下,您不会获得来自外观集的任何值。您必须手动调用control.ApplyStyleSheetSkin(页面):http://msdn.microsoft.com/en-us/library/system.web.ui.control.applystylesheetskin.aspx