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

TreeView 分层加载 三级大数据

谁能帮帮我!
是这样的 我要做个TreeView 分层加载 一共有三个级 单位, 部门,员工, 这个三个级中的数据在三张表里面 用id关联起的,
  由于每级数据都很多 不能一次加载三个级 。

这个TreeView 中还有个复选框 要做到子选父被选,父选子全选。  如果没有加载的员工在部门被选中后自动加载并且选中。 --------------------编程问答-------------------- js+treeview --------------------编程问答-------------------- 先加载单位,然后再节点展开事件中,加载其他 --------------------编程问答-------------------- treeview已经能实现这个

在后台的 根据点击的节点去加载子节点

--------------------编程问答-------------------- 我只到这个!public partial class aa : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PopulateRootLevel();
        }
    }
    private void PopulateRootLevel()
    {
        DataTable dt = DBFun.dataTable("Select id, name,(select count(*) FROM sc_productcat WHERE parent_id=sc.id) as childnodecount From sc_productcat sc where parent_id=0 order by [position] desc, id");
        PopulateNodes(dt, TreeView1.Nodes);
    }
    private void PopulateSubLevel(int parentid, TreeNode parentNode)
    {
        DataTable dt = DBFun.dataTable("Select id, name,(select count(*) FROM sc_productcat WHERE parent_id=sc.id) as childnodecount From sc_productcat sc where parent_id=" + parentid + " order by [position] desc, id");
        PopulateNodes(dt, parentNode.ChildNodes);
    }
    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        PopulateSubLevel(Convert.ToInt32(e.Node.Value), e.Node);
    }

    private void PopulateNodes(DataTable dt, TreeNodeCollection nodes)
    {
        foreach (DataRow dr in dt.Rows)
        {
            TreeNode tn = new TreeNode();
            tn.Text = dr["name"].ToString();
            tn.Value = dr["id"].ToString();

            nodes.Add(tn);

            tn.PopulateOnDemand = (Convert.ToInt32(dr["childnodecount"]) > 0 ? true : false);
            tn.SelectAction = TreeNodeSelectAction.Expand;

        }
    }

}
这个加载后出现的部门当我点击第一个部门的时候还是部门  还有就是 我的树上面有个复选框 点击这个复选框的时候 也要实现加载复选框下(没有加载的)子节点并且让其子节点加载!  比如说 我选上了第一个单位
那么该单位下的部门全部加载并且 这些部门全部被选中 这些部门下的员工也加载选中!  --------------------编程问答-------------------- 可以用站点地图试试啊~ --------------------编程问答-------------------- 这个是动态的啊 --------------------编程问答--------------------  <div>
    <asp:TreeView ID="TreeView1" ExpandDepth="1" PopulateNodesFromClient="true" runat="server" ShowCheckBoxes="All"  OnTreeNodeExpanded="TreeView1_TreeNodePopulate"></asp:TreeView>
    </div>

 public void FillData(DataSet ds, string tableName, string strSql)
    {
       
        using (SqlConnection conn = new SqlConnection(strconn))
        {
            conn.Open();
            SqlDataAdapter adp = new SqlDataAdapter(strSql, conn);
            adp.Fill(ds, tableName);
        }
    }
    private void node()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("name", typeof(System.String));
        dt.Columns.Add("id", typeof(System.String));
        dt.Columns.Add("childnodecount", typeof(System.String));
        DataRow dr = dt.NewRow();
        dr["name"] = "接收人";
        dr["childnodecount"] = "1";
        dr["id"] = "1";
        dt.Rows.Add(dr);
        PopulateNodes(dt, TreeView1.Nodes);
    }
    private void PopulateRootLevel(int p, TreeNode treeNode)
    {
        string sql = "select id,depart as name,(select count(*) FROM UserSubDepart where DepartId=sc.id) as childnodecount from UserDepart as sc order by Id";
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        FillData(ds,"da", sql);
        dt = ds.Tables[0];
        PopulateNodes(dt, treeNode.ChildNodes);
    }
    private void PopulateSubLevel(int parentid, TreeNode parentNode)
    {
        string sql = "select id,Depart1 as name ,(select count(*) FROM UserTelephone1 where SubDepart=sc.id ) as childnodecount from UserSubDepart as sc where DepartId='" + parentid + "' order by Id";
        DataTable dt = new DataTable();
        DataSet ds = new DataSet();
        FillData(ds, "da", sql);
        dt = ds.Tables[0];
        PopulateNodes(dt, parentNode.ChildNodes);
    }
    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        if (e.Node.Depth==0)
        {
            if (e.Node.ChildNodes.Count >0)
            {

            }
            else {
                PopulateRootLevel(Convert.ToInt32(e.Node.Value), e.Node);
            }
        }
        else if (e.Node.Depth == 1)
        {
            if (e.Node.ChildNodes.Count == 0)
            {
                PopulateSubLevel(Convert.ToInt32(e.Node.Value), e.Node);
            }
        }
        else
        {
            if (e.Node.ChildNodes.Count == 0)
            {
                PopulateSubLeve(Convert.ToInt32(e.Node.Value), e.Node);

            }
        }
    }

    private void PopulateSubLeve(int p, TreeNode treeNode)
    {
        string sql = "select id,UserName as name ,(select count(*) FROM UserTelephone1  where id=sc.id ) as childnodecount from UserTelephone1  as sc where isok=0 and SubDepart='" + p + "' order by Id";
        DataTable dt = new DataTable();
        DataSet ds = new DataSet();
        FillData(ds, "da", sql);
        dt = ds.Tables[0];
        foreach (DataRow dr in dt.Rows)
        {
            TreeNode tn = new TreeNode();
            tn.Text = dr["name"].ToString();
            tn.Value = dr["id"].ToString();
            treeNode.ChildNodes.Add(tn);
        }
    }
    private void PopulateNodes(DataTable dt, TreeNodeCollection nodes)
    {
        foreach (DataRow dr in dt.Rows)
        {
            TreeNode tn = new TreeNode();
            tn.Text = dr["name"].ToString();
            tn.Value = dr["id"].ToString();

            nodes.Add(tn);

            tn.PopulateOnDemand = (Convert.ToInt32(dr["childnodecount"]) > 0 ? true : false);
            tn.SelectAction = TreeNodeSelectAction.Expand;

        }
    }

我现在分布式加载已经成功了 但是又一个问题卡住了我  因为我这个树要实现子选父被选 父选子全选 

如果没有加载子节点 选择了父节点那么该父节点下的子节点没有选中 我想要一个父节点选中了 如果没有子节点就加载子节点 如果有子节点就不用了 !或者如果没有加载子节点,而父节点被选中就提示需要加载! --------------------编程问答--------------------  <script  type="text/javascript">
    function CheckEvent(evt) 

evt=window.event||evt;
var objNode = evt.srcElement||evt.target;
if(objNode.tagName == "INPUT" && objNode.type== "checkbox") 
{
var objParentDiv = objNode.id.replace("CheckBox","Nodes");
if(objNode.checked==true) 

setChildCheckState(objParentDiv,true); 

setParentCheckeState(objNode,true); 
}
}
else 
{
setChildCheckState(objParentDiv,false);

if(!HasOtherChecked(objNode)){ 
setParentCheckeState(objNode,false); 
}
}
}
}

//判断是否有并行的其他节点被选中
function HasOtherChecked(objNode)
{
var objParentDiv = WebForm_GetParentByTagName(objNode, "div"); 

var chks = objParentDiv.getElementsByTagName("INPUT");
for(var i=0;i<chks.length;i++){
if(chks[i].checked && chks[i].id != objNode.id)
{
return true;
}
}
return false;
}

//设置父节点
function setParentCheckeState(objNode,chkstate) 

try{
var objParentDiv = WebForm_GetParentByTagName(objNode, "div"); 

if(objParentDiv == null || objParentDiv == "undefined "){ 


else{
var objParentChkId = objParentDiv.id.replace("Nodes","CheckBox"); 
var objParentCheckBox = document.getElementById(objParentChkId); 

if(objParentCheckBox){ 
objParentCheckBox.checked = chkstate;
setParentCheckeState(objParentDiv,chkstate);
}
}
}
catch(e){}


//设置子节点
function setChildCheckState(nodeid,chkstate) 

var node = document.getElementById(nodeid);
if(node){
var chks = node.getElementsByTagName("INPUT");
for(var i=0;i<chks.length;i++){
chks[i].checked = chkstate;
}
}

    </script> --------------------编程问答-------------------- treeview不是有个什么属性的嘛  好像有你查查咯 --------------------编程问答-------------------- http://blog.sina.com.cn/s/blog_50fc32cd01008g38.html --------------------编程问答--------------------
引用 2 楼 bdmh 的回复:
先加载单位,然后再节点展开事件中,加载其他
 建议先加载目录,然后在点击每个目录的时候再去获取下面的数据,ajax 就ok了~~ --------------------编程问答-------------------- 参考以下代码


    DataTable dt = new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            dt.Columns.Add("a1");
            dt.Columns.Add("a2");
            dt.Columns.Add("a3");
            dt.Columns.Add("num", Type.GetType("System.Int32"));
            dt.Rows.Add(new object[] { "1", "0", "我的文件夹", 2 });
            dt.Rows.Add(new object[] { "2", "0", "工作文件夹", 1 });
            dt.Rows.Add(new object[] { "3", "1", "图片", 1 });
            dt.Rows.Add(new object[] { "4", "1", "文档", 2 });
            dt.Rows.Add(new object[] { "5", "3", "风景", 2 });
            dt.Rows.Add(new object[] { "6", "3", "人物", 1 });
            dt.Rows.Add(new object[] { "7", "2", "报告", 1 });
            dt.Rows.Add(new object[] { "8", "3", "写真", 3 });
           
            bindData("0", TreeView1.Nodes);
            

        }
    }
    private void bindData(string parentid,TreeNodeCollection tnc)
    {
        DataRow[] ary_row = dt.Select("a2=" + parentid, "num");
        int i = 0;
        foreach (DataRow item in ary_row)
        {
            TreeNode node = new TreeNode();
            node.Text = item["a3"].ToString();
            node.Value = item["a1"].ToString();
            node.Expanded = true;
            tnc.Add(node);
            bindData(item["a1"].ToString(), tnc[i].ChildNodes);
            i++;
        }
    }
--------------------编程问答-------------------- 楼主应该有点功底的吧。动态加载的,你研究一下MSDN,上面比较清楚的,我就不多说了。
关于级联选择,我正好做了一个,当然,我只是改写了webabcd大虾的SmartTree代码,他的代码不支持动态加载及在updatepanel中使用,我稍改了下,在我项目中正常,但未大量测试,特别是未在动态加载中测试过
使用方法,在aspx页面中加入下面的javascript,不需要任何修改(或许不合适FireFox)。然后设置<asp:treeview onclick="CascadeCheckmarks();">

function CascadeCheckmarks()
{
    // obj gives us the node on which check or uncheck operation has performed
    var evt =window.event; // FF || IE
    var element = evt.srcElement || evt.target;
    
    //checking whether obj consists of checkbox to avoid exception
    if (isCheckBox(element))
    {
        
        yy_stv_foreachChildCheckbox(element);
        yy_stv_foreachParentCheckbox(element);
    }
}

function isCheckBox(obj)
{
    if (obj==null)
        return false;
    return (obj.tagName == 'INPUT' && obj.type == 'checkbox');
}

function yy_stv_checkParentCheckbox(table, checked)
{
/// <summary>设置父复选框的状态</summary>

    var nodes = table.parentNode.parentNode.childNodes;
        
    for (var i=1; i<nodes.length; i++)
    {
        if (nodes[i] == table.parentNode)
        {
            if (typeof(nodes[i-1]) == 'undefined' || typeof(nodes[i-1].rows) == 'undefined') return;

            for (var x=0; x < nodes[i-1].rows.length; x++)
            {
                for (var j=0; j < nodes[i-1].rows[x].cells.length; j++)
                {
                    // debugger;
                    var chk = nodes[i-1].rows[x].cells[j].childNodes[0];
                    if (typeof(chk) != 'undefined' && chk.tagName == "INPUT" && chk.type == "checkbox") 
                    {
                        chk.checked = checked;
                        yy_stv_foreachParentCheckbox(nodes[i-1]);
                        return;
                    }
                }
            }
        }
    }
}

function yy_stv_foreachChildCheckbox(obj)
{   
/// <summary>单击父复选框时,设置其子复选框的选中状态</summary>

    var checked;
    
    if (obj.tagName == "INPUT" && obj.type == "checkbox") 
    {
        checked = obj.checked;
        do
        {
            obj = obj.parentNode;
        } 
        while (obj.tagName != "TABLE")
    }
    
    var nodes = obj.parentNode.childNodes;
        
    for (var i=0; i<nodes.length - 1; i++)
    {
        if (nodes[i] == obj && nodes[i + 1].tagName == "DIV")
        {
            var elements = nodes[i+1].getElementsByTagName("INPUT");
            
            for (j=0; j< elements.length; j++) 
            {       
                if (elements[j].type == 'checkbox') 
                {
                    elements[j].checked = checked;
                }
            }    
        }
    }
}

function yy_stv_foreachParentCheckbox(obj)
{    
/// <summary>单击某一复选框时,设置其父复选框的选中状态</summary>

    var checkedNum = 0;
    var uncheckedNum = 0;
    
    if (obj.tagName == "INPUT" && obj.type == "checkbox") 
    {
        do
        {
            obj = obj.parentNode;
        } 
        while (obj.tagName != "TABLE")
    }
                
    var tables = obj.parentNode.getElementsByTagName("TABLE");
     
    if (typeof(tables) == 'undefined') return;
       
    for (var i=0; i < tables.length; i++)
    {        
        for (var x=0; x < tables[i].rows.length; x++)
        {
            for (var j=0; j < tables[i].rows[x].cells.length; j++)
            {
                var chk = tables[i].rows[x].cells[j].childNodes[0];
                if (typeof(chk) != 'undefined' && chk.tagName == "INPUT" && chk.type == "checkbox") 
                {
                    if (chk.checked)
                        checkedNum ++;
                    else
                        uncheckedNum ++;
                }
            }
        }
    }
    
    if (uncheckedNum == 0)
    {
        yy_stv_checkParentCheckbox(obj, true);
    }
    else
    {
        yy_stv_checkParentCheckbox(obj, false);
    }
}
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,