惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
人人都是产品经理
人人都是产品经理
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
小众软件
小众软件
B
Blog
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
A
About on SuperTechFans
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
V
V2EX

博客园 - 雪山之巅

[原创][代码]类似IE设置代理服务器那样的数据快速批量操作业务的实现 [原创]大量数据导出为Excel文件的问题解决(C#,ASP.NET) [转载整理]一本java书的序言——开发历程思绪随笔 在.NET中发送邮件,使用回执功能中遇到问题的解决方法[在NOTES服务器上,C#,.NET2.0环境] powerdesigner中生成数据库脚本时出现长度限制问题的解决方法 - 雪山之巅 - 博客园 [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令 VS2005无法调试,绑定句柄无效问题的解决方法 部署Excel相关的应用程序过程中遇到“检索COM类工厂中CLSID...”的两个错误的解决方法 [原创][开源]整合梅花雨日历控件,推出.NET版本 [原创]Oracle数据库性能优化的方案[有删节] 两个读取数据库VIew的定义的SQL语句的写法[Oracle /SQL SERVER] [SQL使用经验]选用 IN 还是 EXISTS,哪个性能更好 [笔记]4.软件规模和开发的关系 [笔记]3.软件代码中的BUG问题的一些记录 [笔记]2.软件质量的一些统计数据 [笔记]1.软件的质量特性characteristics of software quality 一个简单的UrlRewrite示例[演示用,写给同事看的,VS2003环境] Oracle中隐式游标和显式游标的教训[同事的经历] VS2003中自定义控件的智能提示解决方案备忘
[原创]Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
雪山之巅 · 2007-12-21 · via 博客园 - 雪山之巅

笔者前言:本文要说的内容仅针对ASP.NET 2.0以上版本适用,内容也非常的简单,本来不应该放在首页的,但发现不知道的开发者非常多,有必要提醒一下。所以请熟悉Treeview的朋友包涵了,呵呵。

现在Ajax流行,各类Tree的第三方控件支持异步加载的非常多。
我们项目组的成员通常到处找些树控件来用,给项目的稳定性带来很多隐患,出了几次问题。

我建议大家考虑直接使用.net自带的TreeView控件。但这个控件这样才能异步加载呢?
先看看示例代码:
其中 SelectAction="Expand" PopulateOnDemand="true" 这两个属性是关键,在后台代码中,大家也可以看到给有子节点的节点,需要设置相关属性

        <asp:TreeView ID="TreeView1" runat="server" EnableClientScript="true" OnTreeNodePopulate="PopulateNode" ImageSet="Arrows" ExpandDepth="0">
            
<Nodes>
                
<asp:TreeNode Text="部门树" Value="部门树" SelectAction="Expand" PopulateOnDemand="true"/>
            
</Nodes>
        
</asp:TreeView>

后台代码:
注意PopulateNode ,这个代码中的写法,是因为我连接的是一个每个层级的部门分别放在不同数据库表,如果各个层级的部门数据都在同一个表里,代码将更加简单。
TopSmart.UtilClass.Data.IDatabase 这个我自己封装数据库的类,大家可以替换使用自己常用的数据库类,然后就可以了

    public void PopulateNode(Object sender, TreeNodeEventArgs e)
    
{
        PopulateMe(e.Node,e.Node.Depth);
    }



    
public void PopulateMe(TreeNode node, int Depth)
    
{
        TopSmart.UtilClass.Data.IDatabase db 
= TopSmart.UtilClass.Data.DataAccess.DatabaseCreate("hr");

        DataTable dt;
        
if (Depth == 0)
            dt 
= db.GetDataTableFromSQL("select t.onelevelname as name,t.onelevelno as no from hrt_onelevel_dic t where t.valid = 1");
        
else if (Depth == 1)
            dt 
= db.GetDataTableFromSQL("select t.twolevelname as name,t.twolevelno as no from hrt_twolevel_dic t where t.valid = 1 and t.onelevelno = '" + node.Value + "'");
        
else
            dt 
= db.GetDataTableFromSQL("select t.deptname as name,t.deptno as no from hrt_dept_dic t where t.valid = 1 and t.twolevelno = '" + node.Value + "'");

        
if (dt.Rows.Count > 0)
        
{
            
foreach (DataRow row in dt.Rows)
            
{
                TreeNode NewNode 
= new TreeNode(row["name"].ToString(), row["no"].ToString());
                NewNode.PopulateOnDemand 
= (Depth == 2? false : true;
                NewNode.SelectAction 
= TreeNodeSelectAction.Expand;
                node.ChildNodes.Add(NewNode);
            }

        }

    }

NewNode.PopulateOnDemand = (Depth == 2? false : true; 这句是因为等于2的时候,我的系统没有更低的子部门了。大家可以灵活使用,呵呵。

代码完毕。大家看看,是不是很简单?
而且简单的就控制哪个节点可以异步加载,哪个不用。不用写脚本,不用写web service,呵呵。

官方的文档,大家可以参考msdn:地址为

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref16/html/P_System_Web_UI_WebControls_TreeNode_PopulateOnDemand.htm

http://piedpiper.cnblogs.com
本文是偶原创,想转贴的朋友劳驾写明转贴二字。呵呵