天天看点

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

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

现在Ajax流行,各类Tree的第三方控件支持异步加载的非常多。

我们项目组的成员通常到处找些树控件来用,给项目的稳定性带来很多隐患,出了几次问题。

我建议大家考虑直接使用.net自带的TreeView控件。但这个控件这样才能异步加载呢?

先看看示例代码:

其中

 SelectAction

="Expand"

 PopulateOnDemand

="true" 这两个属性是关键,在后台代码中,大家也可以看到给有子节点的节点,需要设置相关属性

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

<

asp:TreeView 

ID

="TreeView1"

 runat

="server"

 EnableClientScript

="true"

 OnTreeNodePopulate

="PopulateNode"

 ImageSet

="Arrows"

 ExpandDepth

="0"

>

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

<

Nodes

>

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

<

asp:TreeNode 

Text

="部门树"

 Value

="部门树"

 SelectAction

="Expand"

 PopulateOnDemand

="true"

/>

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

</

Nodes

>

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

</

asp:TreeView

>

后台代码:

注意PopulateNode ,这个代码中的写法,是因为我连接的是一个每个层级的部门分别放在不同数据库表,如果各个层级的部门数据都在同一个表里,代码将更加简单。

TopSmart.UtilClass.Data.IDatabase 这个我自己封装数据库的类,大家可以替换使用自己常用的数据库类,然后就可以了

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

public

void

 PopulateNode(Object sender, TreeNodeEventArgs e)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

{

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        PopulateMe(e.Node,e.Node.Depth);

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

    }

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

public

void

 PopulateMe(TreeNode node, 

int

 Depth)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

{

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        TopSmart.UtilClass.Data.IDatabase db = TopSmart.UtilClass.Data.DataAccess.DatabaseCreate("hr");

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        DataTable dt;

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        if (Depth == 0)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

            dt = db.GetDataTableFromSQL("select t.onelevelname as name,t.onelevelno as no from hrt_onelevel_dic t where t.valid = 1");

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        else if (Depth == 1)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

            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 + "'");

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        else

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

            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 + "'");

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        if (dt.Rows.Count > 0)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

{

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

            foreach (DataRow row in dt.Rows)

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)
Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

{

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

                TreeNode NewNode = new TreeNode(row["name"].ToString(), row["no"].ToString());

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

                NewNode.PopulateOnDemand = (Depth == 2) ? false : true;

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

                NewNode.SelectAction = TreeNodeSelectAction.Expand;

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

                node.ChildNodes.Add(NewNode);

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

            }

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

        }

Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0)

    }

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

v