Treeview 异步加载树

本文详细介绍了 ASP.NET 中 TreeView 控件的使用方法,包括前后端代码实现细节,如绑定数据、展开节点加载子菜单等功能,并提供了完整的 JavaScript 和 C# 示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台:

<asp:TreeView ID="tree" runat="server" MaxDataBindDepth="2" OnTreeNodePopulate="tree_TreeNodePopulate" PopulateNodesFromClient="true"
EnableClientScript="true" ExpandDepth="1" ShowCheckBoxes="All" ShowLines="True" Width="80%">
</asp:TreeView>


JS 代码:

<script language="javascript" type="text/javascript">
function onTreeClick()
{
    var obj = event.srcElement;
    if( obj.tagName != "INPUT" ) return;
    if( obj.type != "checkbox" ) return;
    //
    if( obj.checked )setParentChecked( obj );
    var id = obj.id;
    id = id.substring( 0,id.indexOf( "CheckBox"));
    //
    var div = document.all( id + "Nodes"  );
    if( div == null )
    {
        DoSelectRightItemID(obj);
        return;//没有子结点
    }
    //
    CheckChild( div , obj.checked );

}
function CheckChild( divID , checked )
{
    var   objchild =  divID.children;
    var   count =  objchild.length;   
    for(var   i=0;i <objchild.length;i++)
    {
        var   tempObj   =   objchild[i];
        if(tempObj.tagName== "INPUT"   &&   tempObj.type   ==   "checkbox")
        {
            tempObj.checked   =   checked;
        }
        CheckChild(tempObj,checked);   
    }

}

function setParentChecked(objNode)
{   
        var   objParentDiv   =   public_GetParentByTagName(objNode, "div");
        if(objParentDiv==null   ||   objParentDiv   ==   "undefined")
        {
                return;
        }
        var   objID   =   objParentDiv.getAttribute( "ID");
        objID   =   objID.substring(0,objID.indexOf( "Nodes"));
        objID   =   objID+ "CheckBox";
        var   objParentCheckBox   =   document.getElementById(objID);
        if(objParentCheckBox==null   ||   objParentCheckBox   ==   "undefined")
        {
                return;
        }   
        if(objParentCheckBox.tagName!= "INPUT"   &&   objParentCheckBox.type   ==   "checkbox")
        return;   
        objParentCheckBox.checked   =   true;
        setParentChecked(objParentCheckBox);
}

function   public_GetParentByTagName(element,   tagName)   
{
        var   parent   =   element.parentNode;
        var   upperTagName   =   tagName.toUpperCase();
        //如果这个元素还不是想要的tag就继续上溯
        while   (parent   &&   (parent.tagName.toUpperCase()   !=   upperTagName))   
        {
                parent   =   parent.parentNode   ?   parent.parentNode   :   parent.parentElement;
        }
        return   parent;
}

</script>

<script>
function DoSelectRightID( obj )
{
    var tr = obj.parentNode.parentNode;
    for(var i=2;i< tr.cells.length;i++ )
    {
        var td = tr.cells[i];
        
        if( td.childNodes.length == 2 )
        {
            td.childNodes[0].checked = true;
            break;
        }
    }
   
}
function DoSelectRightItemID( obj )
{
    if( obj.value.length == 1) return;
    var tr = obj.parentNode.parentNode;
    //alert( tr.innerHTML);
   
    for(var i=3;i< tr.cells.length;i++ )
    {
        var td = tr.cells[i];
        if( td.childNodes.length == 2  )
        {
            if( td.childNodes[0].value != null && td.childNodes[0].value.length == 1 )
            {
                td.childNodes[0].checked = obj.checked;
                //break;
             }
        }
        
    }
}
</script>




后台:

先添加根节点

  /// <summary>
    /// 加载一级菜单
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="parentid"></param>
    private void LoadMenuTree(string ParentId)
    {
        DataSet ds = “记录集”
        DataTable dt = ds.Tables[0];
        DataRow[] dr = dt.Select("parentid = '" + ParentId+ "'");
        foreach (DataRow drow in dr)
        {
            TreeNode tn = new TreeNode(drow["MenuName"].ToString());
            tree.Nodes.Add(tn);
            tn.Value ="";
            tn.ImageUrl = "";
            tn.SelectAction = TreeNodeSelectAction.Expand;
            tn.PopulateOnDemand = true;
            tn.Expanded = false;
            tn.ToolTip = "0";
            tn.Target = "_self";
        }
    }

   /// <summary>
    /// 加载子菜单
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="parentNode"></param>
    private void LoadMenuTree(DataTable dt, TreeNode parentNode)
    {
        DataRow[] dr = dt.Select("parentid = '" + parentNode.Value + "'");
        foreach (DataRow drow in dr)
        {
            TreeNode tn = new TreeNode();
            parentNode.ChildNodes.Add(tn);
            tn.ToolTip = "";
            tn.ImageToolTip = "";

            tn.Value = Menuid;
            tn.ImageToolTip = "";
            tn.ImageUrl = "";
            tn.SelectAction = TreeNodeSelectAction.None;
            LoadMenuTree(dt, tn);
        }
    }

//展开树加载

  protected void tree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        DataSet ds ="记录集"
        DataTable dt = ds.Tables[0];
        if (e.Node.ChildNodes.Count == 0)
        {
            LoadMenuTree(dt, e.Node);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值