`
coconut_zhang
  • 浏览: 531462 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

TreeView高效绑定数据

阅读更多

前俩个项目都是做政府的门户网,他们的栏目、部门都要以树形展示,一开始数据比较少,直接递归绑定到TreeView上,后来数据越来越多,树越来越慢,到后面打开一次导入数据至少要等待2分钟。客户不满意了,只能对树形绑定数据进行修改,去网上查了下,发现下面的方法速度比较快
第一次只导入所有根栏目,就是数据库ParentId=0的数据。点击父栏目,如果有子栏目,再从数据库查询其子栏目、绑定。
代码如下:


树形控件
<table width="97%" border="0" cellpadding="3" cellspacing="1" bgcolor="a2c4de">
                            <tr>
                                <td height="30" colspan="4" align="center" background="images/bg7.jpg" bgcolor="#FFFFFF"
                                    class="font12B">
                                    栏目管理</td>
                            </tr>
                           
                            <tr>
                                <td valign="top" colspan="4" align="left" bgcolor="#FFFFFF" >
                                    <asp:TreeView ID="treeCatalog" runat="server" Width="100%" Height="100%"
                                      OnTreeNodePopulate="TreeCatalog_TreeNodePopulate" ExpandDepth="1" ImageSet="Arrows" CollapseImageToolTip="折叠 " ExpandImageToolTip="展开 ">
                                    </asp:TreeView>
                                </td>
                            </tr>
                        </table>
cs代码
绑定数据
private void LoadData()
    {
        try
        {
            DataTable table = new DataTable();
            table = getChildNode(0);            //得到所有所有父节点,放到DataTable中,这里默认根节点的父节为0
            BindNode(table, treeCatalog.Nodes);   //绑定所有的父节点
        }
        catch (Exception ex)
        {
            Response.Write("<script>window.top.navigate('Login.aspx');</script>");
        }
    }

    得到父节点的字节点,放到DataTable中#region 得到父节点的字节点,放到DataTable中
    private DataTable getChildNode(int ParentId)
    {
        DataTable table = new DataTable();
        DataService.Service service = new Service();
        DataSet ds = service.CatalogGetByParentId(ParentId).SearchResultDataSet;
        if (ds!=null&&ds.Tables[0].Rows.Count>0)
        {
            table = ds.Tables[0];
        }
        else
        {
            table = null;
        }
        return table;
    }
    #endregion

    填充节点#region 填充节点
    private void BindNode(DataTable table,TreeNodeCollection node)
    {
        DataView dv = new DataView(table);
        TreeNode NewNode;
        foreach(DataRowView dr in dv)
        {
            NewNode = new TreeNode();
            string text = "<a href='CatalogEdit.aspx?Id=" + dr["Id"].ToString() + "'>" + dr["Name"].ToString();
            text +="</a>&nbsp;&nbsp;&nbsp;<a href='CatalogAdd.aspx?ParentId=" + dr["Id"].ToString() + "'>";
            text+="<img alt='增加子栏目' src='images/jia.jpg' border='0'></a>";
            NewNode.Text = text;
            NewNode.Value = dr["Id"].ToString();
            node.Add(NewNode);
            NewNode.PopulateOnDemand = Convert.ToInt32(dr["ChildNodeCount"].ToString())>0;
        }
    }
    #endregion

    填充节点事件#region 填充节点事件
    protected void TreeCatalog_TreeNodePopulate(object sender,TreeNodeEventArgs e)
    {
        getDataNode(Convert.ToInt32(e.Node.Value), e.Node);     //点加号展开时调用.得到数据并绑定.传入点击结点 ID,和点击节点对像.
    }
    #endregion

    private void getDataNode(int ParentId,TreeNode Node)
    {
        BindNode(getChildNode(ParentId), Node.ChildNodes);      //向结点填充数据.
    }

存储过程
存储过程
CREATE PROCEDURE usp_CatalogGetByParentId
(
@ParentId        int
)
AS
BEGIN
    if @ParentId is null
    SELECT Id,Name,ParentId,CategoryId,IsParent,(select count(*) from Catalog where ParentId=C.Id and Status<>99 ) as ChildNodeCount
    FROM Catalog C where status <>99 and ParentId is null order by [order]
    else
    SELECT Id,Name,ParentId,CategoryId,IsParent,(select count(*) from Catalog where ParentId=C.Id and Status<>99 ) as ChildNodeCount
    FROM Catalog C where status <>99 and ParentId=@parentId order by [order]
END

分享到:
评论

相关推荐

    明日科技C#开发入门及项目实战

    实例109 将xml文件节点绑定到treeview控件中 实例110 修改treeview控件的节点文本 第11章 c#面向对象高级技术 实例111 利用接口实现选择不同的语言 实例112 使用接口作为方法参数进行编程 实例113 自定义抽象类计算...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例109 将xml文件节点绑定到treeview控件中 178 实例110 修改treeview控件的节点文本 179 第11章 c#面向对象高级技术 181 实例111 利用接口实现选择不同的语言 182 实例112 使用接口作为方法参数进行编程 184 实例...

    WPF编程宝典 part1

    22.2.1 创建数据绑定的TreeView 控件 614 22.2.2 将DataSet对象绑定到TreeView 控件 617 22.2.3 即时创建节点 618 22.3 DataGrid控件 621 22.3.1 改变列的尺寸与重新安排列 622 22.3.2 定义列 623 22.3.3 设置列的...

    WPF编程宝典 part2

    22.2.1 创建数据绑定的TreeView 控件 614 22.2.2 将DataSet对象绑定到TreeView 控件 617 22.2.3 即时创建节点 618 22.3 DataGrid控件 621 22.3.1 改变列的尺寸与重新安排列 622 22.3.2 定义列 623 22.3.3 设置列的...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和...数据控件、自定义用户控件、文件基本操作、文件夹基本操作、文件流操作、加密、解密及解压缩文件、C#与Word互操作、高效应用Excel、基本图形...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

Global site tag (gtag.js) - Google Analytics