原作  朱先忠

引子
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控件起作用:

  • 必须使用对级联样式表 (CSS) 类的引用来应用样式。例如,使用属性-CssClass(其中属性指 Property)属性 (Attribute) 来设置样式,而不是使用属性-子属性(其中属性指 Property)属性 (Attribute) 设置NodeStyle属性 (Property)。同样,在使用NodeStyle模板设置样式时,请使用模板的CssClass属性 (Attribute)。

  • EnableClientScript属性必须为true(默认值)。此外,如果对TreeView控件启用了回调,则不能在异步回发之间更改EnableClientScript属性..............《=

本人感觉MSDN在这里也说得不很清楚,特别是关于使用限制条件方面。


实际使用情况

首先需要说明的是,我的使用环境是: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:TreeViewSkinId="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),以前的结论不可照搬便用,需要查阅最新资料及积极试验才更为可行。

posted on 2009-08-14 17:21  superlee  阅读(445)  评论(0编辑  收藏  举报