当前位置:编程学习 > C#/ASP.NET >>

树中如何动态加载一个节点的数据?点击后动态加载孩子下级节点

我用asp.net做了一个树型目录的程序,原来是一下吧所有的数据都读到客户端,在客户端构建树型结构,即静态显示。但如果数据量大的话这种方法可能就有太慢了,现在想动态加载一个节点的数据,即每点一个节点展开该节点的孩子时动态从数据库中加载数据,不知道行不行,有什么办法没有小弟很急,望各位高手出招。 

请问TreeView控件提供了什么事件,试了下好象不行,请高手相助,谢谢~~ --------------------编程问答-------------------- 在实际工作中,很多情况下需要将Treeview与数据库进行连接,以填充其节点。然而,往往由于数据库数据众多,一次性灌入所有的根节点与子节点,会耗用大量的起始等待时间。解决的方案,应该是动态加载节点,起始的时候,只加载根节点,在点击某个根节点时,才加载其子节点,再点击某个子节点时,才加载子节点的子节点,以此类推,这样的处理方法可以达到提高工作效率,节省访问时间的妙用。

我的意思就是这样的 --------------------编程问答-------------------- 顶,怎么没人来呢?
。。。。 --------------------编程问答-------------------- 哈哈,都吃饭去了,当然可以动态加载,写AfterSelect事件中即可 --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- TO changjiangzhibin 

AfterSelect事件是VB中的事件吧 --------------------编程问答-------------------- 请问ASP。NET中提供了相关的事件吗?都试了下没适合的 --------------------编程问答-------------------- ?? --------------------编程问答-------------------- 这样不知道是不是你要的
你这样试试 
void treeView()
    {
        DataView dv = da.Query("select * from 你的表") as DataView;
        foreach (DataRowView drv in dv)
        {
            if (drv["pid"].ToString() == "0")
            {
                TreeNode tn = new TreeNode();
                tn.Text = drv["你表中的字段"].ToString();
                tn.Value = drv["同上"].ToString();
                tn.Target = drv["同上"].ToString();
                tv.Nodes.Add(tn);
                ChildNode(tn);
            }
        }
    }
//下面的同理
    void ChildNode(TreeNode tn)
    {
        DataView dv = da.Query("select * from tree") as DataView;
        foreach (DataRowView drv in dv)
        {
            if (drv["pid"].ToString() == tn.Value)
            {
                TreeNode child = new TreeNode();
                child.Text = drv["treename"].ToString();
                child.Value = drv["id"].ToString();
                child.Target = drv["pid"].ToString();
                tn.ChildNodes.Add(child);
                ChildNode(child);
            }
        }
    } --------------------编程问答-------------------- 我觉得你可以用session传递节点vuale值到服务器端,服务器端接收后根据条件递归数据库。修改你的代码就可以实现。 --------------------编程问答-------------------- 把void   ChildNode(TreeNode   tn) 
方法写在treeview的tv_SelectedNodeChanged这个事件里就可以了 --------------------编程问答-------------------- 楼上的
可是session用太多对性能有影响啊 --------------------编程问答-------------------- 我用asp.net做了一个树型目录的程序,原来是一下吧所有的数据都读到客户端,在客户端构建树型结构,即静态显示。但如果数据量大的话这种方法可能就有太慢了,现在想动态加载一个节点的数据,即每点一个节点展开该节点的孩子时动态从数据库中加载数据,不知道行不行,有什么办法没有小弟很急,望各位高手出招。   

请问TreeView控件提供了什么事件,试了下好象不行,请高手相助,谢谢~~

我是出于性能的考虑,而不是要怎么实现树。当数据有几百万条的时候用TREEVIEW性能会受到很大的制约,谢谢!请问明白我的意思了吗/? --------------------编程问答-------------------- TreeNodePopulate事件 --------------------编程问答-------------------- 可以试试用XML文件,XML文件对应TreeView的分层数据,将TreeView的DataSource设定为
XMLDataSource,XMLDataSource.DataFile= xml文件路径。
      效果和采用数据库一样




--------------------编程问答-------------------- 使用AJAX实现无刷新取数据,以下是基本的操作代码
<script language="javascript">
            var Index;
            function ds()
            {
                AjaxTree.returnDs(TreeView1.getTreeNode(Index).getAttribute("NodeData"),returnDs_callback);
            }
            function returnDs_callback(response)
            {
var n=TreeView1.getTreeNode(Index);
var load=n.getChildren();
if(load.length!=1)
{
return;//如果已经存在数据,那就不再读取。
}
else
{
var loadNode=load[0];
loadNode.remove();
}

var ds=response.value;
if(ds!=null && ds.Tables!=null && typeof(ds)=="object")
{
for(var i=0;i<ds.Tables[0].Rows.length;i++)
{
var newNode=TreeView1.createTreeNode();
newNode.setAttribute("NodeData",1);
//newNode.setAttribute("Text",ds.Tables[0].Rows[i].UNSPSCCode+" "+ds.Tables[0].Rows[i].Description);
newNode.setAttribute("Text",ds.Tables[0].Rows[i].Contact);
newNode.setAttribute("ID",ds.Tables[0].Rows[i].Mobile);
//注意 这边必须为OrderID,CustomerID即列名 要不就是无法显示
if(newNode.getAttribute("NodeData")%10==0)
{
var loadNode=TreeView1.createTreeNode();
loadNode.setAttribute("Text","Loading......");
newNode.add(loadNode);
}
n.add(newNode);
}
}
else
{
alert(response.error);
}
}
                 
</script>
<script language="javascript" for="TreeView1" event="onexpand">
                 //TODO:在此处填写TreeView的OnExpand事件的代码。
                 Index= window.event.treeNodeIndex;//获得展开的节点的位置,根节点为0。
                 if(Index=='0')return;//如果是根节点的话就直接返回。
                 ds();
</script> --------------------编程问答-------------------- mark~ --------------------编程问答-------------------- to 15 lou,
could you send your code (cs)

  function   ds() 
                        { 
                                AjaxTree.returnDs(TreeView1.getTreeNode(Index).getAttribute("NodeData"),returnDs_callback); 
                        } 

AjaxTree.returnDs 能贴出来? --------------------编程问答-------------------- 学习,收藏了 --------------------编程问答-------------------- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="tree1.aspx.cs" Inherits="tree1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<link type="text/css" href="css/tree.css" rel="stylesheet">
<title>ajax无刷新OA菜单</title>
<script type="text/javascript" src="fckEditor/tree.js"></script>  
</head>
<body>
    <form id="form1" runat="server">
    <div id="CategoryTreeSum">
    <div id="CategoryTreeS"><a href="javascript:xs()"><h4><img src="Css/root.gif" border="0" />系统菜单</h4></a></div>
    <div class="TreeMenu" id="CategoryTree">
    </div>
</div>
<script language="jscript">
        function   go(url)
        {
                parent.frames["MainFrame"].location=url;
        }
        function xs()
        {
            if(document.getElementById("CategoryTree").style.display == '')
            {document.getElementById("CategoryTree").style.display = 'none';}
            else{document.getElementById("CategoryTree").style.display = '';}
        }
function ExpandSubCategory(iCategoryID)
{
var li_father = el("li_" + iCategoryID);
if (li_father.getElementsByTagName("li").length > 0) //分类已下载
{
ChangeStatus(iCategoryID);
return;
}

li_father.className = "Opened";//初始状态

switchNote(iCategoryID, true);
tree1.GetSubCategory(iCategoryID, GetSubCategory_callback);//调用
}

function GetSubCategory_callback(response)
{
    if(response.value==null)
    {
        top.location.href='index.aspx';
    }
else if (response.value.Tables[0].Rows.length ==0)
{
var li_father = el("li_" + 0);
li_father.innerHTML = "<br>  您无权限菜单,<br>  可联系管理员提权!";
}
else
{
    var dt = response.value.Tables[0];
    if (dt.Rows.length > 0)
    {
    var iCategoryID = dt.Rows[0].ParentModuleID;//父ID
    }
    var li_father = el("li_" + iCategoryID);
    var ul = document.createElement("ul");     
    for (var i = 0;i < dt.Rows.length;i++)
    {
        var a;
        var img;
        var li;
    if (dt.Rows[i].IsChild == 1) //叶子节点
    {
    li = document.createElement("li");
    li.className = "Child";
    li.id = "li_" + dt.Rows[i].quanXianID;
    
    img = document.createElement("img");
    img.id = dt.Rows[i].quanXianID;
    img.className = "s";
    img.src = "css/s.gif";
    
    a = document.createElement("a");
    a.href = "javascript:go('" + dt.Rows[i].URL + "');";//当前id
    a.innerHTML = dt.Rows[i].quanXianMingCheng;
    }
    else
    {
    li = document.createElement("li");
    li.className = "Closed";
    li.id = "li_" + dt.Rows[i].quanXianID;
    
    img = document.createElement("img");
    img.id = dt.Rows[i].quanXianID;
    img.className = "s";
    img.src = "css/s.gif";
    img.onclick = function () {
    ExpandSubCategory(this.id);
    };
    img.alt = dt.Rows[i].quanXianMingCheng;
    
    a= document.createElement("a");
    a.href = "javascript:ExpandSubCategory(" +
    dt.Rows[i].quanXianID + ");";
    a.innerHTML = dt.Rows[i].quanXianMingCheng;
    }
    li.appendChild(img);
    li.appendChild(a);
    ul.appendChild(li);
    }
    li_father.appendChild(ul);
    
    switchNote(iCategoryID, false);
 }

}

function ChangeStatus(iCategoryID)
{
var li_father = el("li_" + iCategoryID);
if (li_father.className == "Closed")
{
li_father.className = "Opened";
}
else
{
li_father.className = "Closed";
}
}

function switchNote(iCategoryID, show)
{
var li_father = el("li_" + iCategoryID);
if (show)
{
var ul = document.createElement("ul");
ul.id = "ul_note_" + iCategoryID;

var note = document.createElement("li");
note.className = "Child";

var img = document.createElement("img");
img.className = "s";
img.src = "css/s.gif";

var a = document.createElement("a");
a.href = "javascript:void(0);";
a.innerHTML = "<img src='css/indicator.gif' border=0/>  <font color=#666666 style=font-size:12px>请稍候...</font>";
note.appendChild(img);
note.appendChild(a);
ul.appendChild(note);
li_father.appendChild(ul);
}
else
{
var ul = el("ul_note_" + iCategoryID);
if (ul)
{
li_father.removeChild(ul);
}
}
}  

// 加载根节点
var tree = el("CategoryTree");
var root = document.createElement("li");
root.id = "li_0";
tree.appendChild(root);

// 加载页面时显示第一级分类
ExpandSubCategory(0);
</script>
    </form>
</body>
</html>
--------------------编程问答-------------------- 不错,收藏
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,