zoukankan      html  css  js  c++  java
  • asp.net treeview 总结

    网上关于Treeview的代码虽然多 但是都是很乱 实用性和正确性也不是很好 只好自己写一套了,时间比较紧张 性能可能还需调整

    以用户组织的一个实际例子来讲诉Treeview的用法吧

    组织表结构:

    用户组织表结构:

    前台界面aspx

    <form id="Form1" runat="server">
            <table>
    
                <tr>
                    <td class="contentTD">
                        <div id="MyTreeDiv">
                            <asp:TreeView ShowCheckBoxes="All" ID="MyTreeView" ImageSet="Contacts" runat="server" ExpandDepth="0" Width="400px" BorderStyle="Solid" BorderWidth="1px">
                            </asp:TreeView>
                        </div>
                    </td>
                </tr>
                <tr>
    
                    <td class="content">
                        <asp:Button ID="btnSubmit" runat="server" Text="提 交" CssClass="dotNetButton" OnClick="btnSubmit_Click" /><input type="button" class="glbutton" onclick="history.go(-1);"
                            value="返 回" />
                        <asp:ListBox ID="ListBox1" Visible="false" runat="server"></asp:ListBox>
                    </td>
                </tr>
            </table>
        </form>

    js控制父节点选中子节点自动选中

    <script>
            function Davidovitz_HandleCheckbox() {
                var element = event.srcElement;
                if (element.tagName == "INPUT" && element.type == "checkbox") {
                    var checkedState = element.checked;
                    while (element.tagName != "TABLE") // Get wrapping table
                    {
                        element = element.parentElement;
                    }
    
                    Davidovitz_UnCheckParents(element); // Uncheck all parents
    
                    element = element.nextSibling;
    
                    if (element == null) // If no childrens than exit
                        return;
    
                    var childTables = element.getElementsByTagName("TABLE");
                    for (var tableIndex = 0; tableIndex < childTables.length; tableIndex++) {
                        Davidovitz_CheckTable(childTables[tableIndex], checkedState);
                    }
                }
            }
    
            // Uncheck the parents of the given table, Can remove the recurse (redundant)
            function Davidovitz_UnCheckParents(table) {
                if (table == null || table.rows[0].cells.length == 2) // This is the root
                {
                    return;
                }
                var parentTable = table.parentElement.previousSibling;
                Davidovitz_CheckTable(parentTable, false);
                Davidovitz_UnCheckParents(parentTable);
            }
    
            // Handle the set of checkbox checked state
            function Davidovitz_CheckTable(table, checked) {
                var checkboxIndex = table.rows[0].cells.length - 1;
                var cell = table.rows[0].cells[checkboxIndex];
                var checkboxes = cell.getElementsByTagName("INPUT");
                if (checkboxes.length == 1) {
                    checkboxes[0].checked = checked;
                }
            }
    
        </script>

    后台代码.cs

    protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    this.MyTreeView.Attributes.Add("onclick", "Davidovitz_HandleCheckbox()");
    
                    bind();
                }
            }
            //数据绑定
            private void bind()
            {
                this.MyTreeView.Nodes.Clear();
                //读取组织列表
                DataTable dt = new T_GroupManager().GetDataTableBySQL(" and FState=1 and FCreatorID = " + Request.QueryString["id"]);
    
                this.ViewState["ds"] = dt;
                //调用递归函数,完成树形结构的生成   
                AddTree(0, (TreeNode)null);
    
                if (Request.QueryString["id"] != null)
                {
                    //根据用户ID查找对应的用户组织结构,勾上
                    List<T_UserGroup> list = new T_UserGroupManager().GetAllBySQL(" and FUSerID=" + Request.QueryString["id"]).ToList();
                    ViewState["UserGroup"] = list;
                    foreach (T_UserGroup item in list)
                    {
                        for (int i = 0; i < this.MyTreeView.Nodes.Count; i++)
                        {
                            if (MyTreeView.Nodes[i].ChildNodes.Count > 0)  //判断是否还有子节点
                            {
                                SetNode(MyTreeView.Nodes[i]);
                            }
                            if (MyTreeView.Nodes[i].Value == item.FGroupID.ToString())       //判断是否被选中
                            {
                                MyTreeView.Nodes[i].Checked = true;
                            }
                        }
                    }
                }
            }
            //查找子节点
            public void SetNode(TreeNode node)
            {
                if (Request.QueryString["id"] != null)
                {
                    //根据ID查找对应的组织结构,勾上
                    List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
                    foreach (T_UserGroup item in list)
                    {
                        for (int i = 0; i < node.ChildNodes.Count; i++)
                        {
                            if (node.ChildNodes[i].ChildNodes.Count > 0)  //判断是否还有子节点
                            {
                                SetNode(node.ChildNodes[i]);  //递归查找
                            }
                            if (node.ChildNodes[i].Value == item.FGroupID.ToString())       //判断是否被选中
                            {
                                node.ChildNodes[i].Checked = true;
                            }
                        }
                    }
                }
            }
    
            //递归添加树的节点
            public void AddTree(int ParentID, TreeNode pNode)
            {
                DataTable ds = (DataTable)this.ViewState["ds"];
                DataView dvTree = new DataView(ds);
                //过滤ParentID,得到当前的所有子节点
                dvTree.RowFilter = "[FParentUserID] = " + ParentID;
    
                foreach (DataRowView Row in dvTree)
                {
                    TreeNode Node = new TreeNode();
                    if (pNode == null)
                    {
                        //添加根节点
                        Node.Text = Row["FGroupName"].ToString();
                        Node.Value = Row["PID"].ToString();
                        this.MyTreeView.Nodes.Add(Node);
                        Node.Expanded = true;
                        //再次递归
                        AddTree(Int32.Parse(Row["PID"].ToString()), Node);
                    }
                    else
                    {
                        //添加当前节点的子节点
                        Node.Text = Row["FGroupName"].ToString();
                        Node.Value = Row["PID"].ToString();
                        pNode.ChildNodes.Add(Node);
                        Node.Expanded = true;
                        //再次递归
                        AddTree(Int32.Parse(Row["PID"].ToString()), Node);
                    }
                }
            }
            /// <summary>
            /// 保存
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void btnSubmit_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < MyTreeView.Nodes.Count; i++)
                {
                    if (MyTreeView.Nodes[i].ChildNodes.Count > 0)  //判断是否还有子节点
                    {
                        GetNode(MyTreeView.Nodes[i]);
                    }
                    if (MyTreeView.Nodes[i].Checked == true)       //判断是否被选中
                    {
                        string s = MyTreeView.Nodes[i].Value.ToString();
                        ListBox1.Items.Add(s);
                    }
                }
                T_UserGroupManager gm = new T_UserGroupManager();
                //清空
                List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
                foreach (T_UserGroup item in list)
                {
                    gm.DeleteByPID(item.PID);
                }
                int id = Convert.ToInt32(Request.QueryString["id"]);
                //保存
                foreach (var item in ListBox1.Items)
                {
                    T_UserGroup ug = new T_UserGroup();
                    ug.FUSerID = id;
                    ug.FGroupID = Convert.ToInt32((item as ListItem).Value);
                    ug.FState = 1;
                    gm.Add(ug);
                }
                ShowJS("<script>alert('保存成功!');location = 'UserGroupInfo.aspx'</script>");
            }
            //获取选中节点
            public void GetNode(TreeNode node)
            {
                for (int i = 0; i < node.ChildNodes.Count; i++)
                {
                    if (node.ChildNodes[i].ChildNodes.Count > 0)  //判断是否还有子节点
                    {
                        GetNode(node.ChildNodes[i]);               //递归查找
                    }
                    if (node.ChildNodes[i].Checked == true)     //判断是否被选中
                    {
                        string s = node.ChildNodes[i].Value.ToString();
                        ListBox1.Items.Add(s);
                    }
                }
            }
        }


    基本上面就是全部代码了,实现了Treeview的读取和根据勾选保存,根据用户配置设置Treeview的勾选项

    用了好一段时间才整理出来的,要转载的童鞋记得保留我的链接哦http://www.cnblogs.com/linyijia/p/3497503.html 

  • 相关阅读:
    JS---数组(Array)处理函数整理
    xStream完美转换XML、JSON
    DD_belatedPNG解决IE6下PNG不透明问题
    转 DataTorrent 1.0每秒处理超过10亿个实时事件
    转 Apache Kafka:下一代分布式消息系统
    Selenium(ThoughtWorks公司开发的web自动化测试工具)
    oracle 拆分字符串并转换为表
    C# winform 使用DsoFramer 创建 显示office 文档
    visual studio 2014 新特性
    转 管线开发
  • 原文地址:https://www.cnblogs.com/linyijia/p/3497503.html
Copyright © 2011-2022 走看看