ASP.NET AJAX服务器框架的主干控件之一即是UpdatePanel控件(你可以把它称作“局部更新王者”,这种称呼并不夸张),但是,是这个控件的使用还是有一定的限制性。
近日,在使用UpdatePanel控件时遇到了一个问题,即能够在UpdatePanel控件内部使用TreeView控件以及如何使用的问题。
他处观点
1,首先来看一个台湾作者章立民在其著作《ASP.NET AJAX经典范例168(VC#版)》(机械工业出版社,2007.8,P92-94)中的看法:
“以下所列的ASP.NET 2.0控件不支持使用于UpdatePanel控件之内:
TreeView控件与Menu控件
......”
2,在网上许多地方干脆不提这些细节,拿来便用(例如http://www.cnblogs.com/spiderDemo/archive/2006/08/20/482062.html,特别是http://www.chinaz.com/Program/.NET/1203204622007.html处与前面章立民先生的看法明显存在差异)。
3,再来看一下中文MSDN(http://msdn.microsoft.com/zh-cn/library/e8z5184w.aspx)的论述:
=》
将 TreeView 控件与 UpdatePanel 控件一起使用
UpdatePanel控件用于通过回发更新页面的选定区域,而不是更新整个页面。可在UpdatePanel控件内使用TreeView控件,但具有以下限制:
-
TreeView回调必须与异步回发关联,否则回调事件验证将会失败。在将TreeNode控件的PopulateOnDemand属性设置为true时,即启用了回调。可以使用以下方法之一来确保TreeView回调对UpdatePanel控件起作用:
-
如果TreeView控件不在UpdatePanel控件内,则在不是异步回发的一部分的TreeNode控件上禁用回调。为此,需要将PopulateOnDemand属性设置为false。
-
以编程方式刷新在异步回发过程中注册回调的所有控件。例如,可以将TreeView控件放置在UpdatePanel控件内。TreeView控件不必位于发起异步回发的UpdatePanel控件中,只要包含TreeView控件的UpdatePanel控件刷新即可。
-
-
必须使用对级联样式表 (CSS) 类的引用来应用样式。例如,使用属性-CssClass(其中属性指 Property)属性 (Attribute) 来设置样式,而不是使用属性-子属性(其中属性指 Property)属性 (Attribute) 设置NodeStyle属性 (Property)。同样,在使用NodeStyle模板设置样式时,请使用模板的CssClass属性 (Attribute)。
-
EnableClientScript属性必须为true(默认值)。此外,如果对TreeView控件启用了回调,则不能在异步回发之间更改EnableClientScript属性..............《=
实际使用情况
首先需要说明的是,我的使用环境是:VS2008(+SP1)及ASP.NET 3.5(+SP1),也就是说,与上面的网页论述时间与环境是有所不同的。
下面是我编写的有关使用 代码情况:
(1)一个产品分类页面Category.aspx:
<asp:UpdatePanel ID="UpdatePanel1" runat=" server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TreeView ID="CategoryView" SkinId="Category"runat="server"
ShowLines="True"/>
</ContentTemplate>
<triggers>
<asp:AsyncPostBackTrigger ControlID="AddBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="DeleteBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="DownBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="UpBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="EditBtn" EventName="Click" />
</triggers>
</asp:UpdatePanel>
[注]在ASP.NET 3.5环境下TreeView 控件的 EnableClientScript属性为 true( 默认值),与前面MSDN所指出的。
(2)上面TreeView 对应皮肤控件的定义:
<asp:TreeView SkinId="Category"runat="server" Width="100%"
BackColor="#CCFFFF" ForeColor="#CC3300" BorderStyle="Double" BorderWidth="2px" ShowLines="True">
<NodeStyle. BackColor="#5A7DD1" ForeColor="#CC3300" Font-Bold="True" Font-Names="Tahoma" Font-Size="14pt"
HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="1px" />
<RootNodeStyle. BackColor="Transparent" Font-Bold="True" ForeColor="White" />
<ParentNodeStyle. Font-Bold="True" />
<HoverNodeStyle. Font-Underline="True" ForeColor="#5A7DD1" BackColor="#CC3300" />
<SelectedNodeStyle. BackColor="#B5B5B5" Font-Bold="True" Font-Underline="False"
HorizontalPadding="0px" VerticalPadding="0px" />
</asp:TreeView>
(3)使用情况
没有问题,运行页面时,可以实现UpdatePanel控件内包围的reeView 控件的局部更新显示。
结论
也不是什么真正的“结论”,不过,根据这个例子得到的结论是,ASP.NET AJAX框架在不断的发展中,特别是开发环境变动时(例如从VS2005到VS2008,从ASP.NET 2.0到ASP.NET 3.5),以前的结论不可照搬便用,需要查阅最新资料及积极试验才更为可行。