繁体   English   中英

从SQL查询生成的ASP.NET Treeview

[英]ASP.NET Treeview generated from SQL query

我目前有一个查询,该查询将数据表返回到C#,其结构如下:

ID | ParentID | ParentOfParentID | Name

我想做的是创建一个函数,将返回的System.Data.DataTable链接到ASP.NET树形视图,以便获得所描述的结构-但到目前为止,我还没有运气。

任何帮助将不胜感激-任何比ASP“更好”的树视图也将有所帮助! (因为我不太喜欢ASP)。

谢谢

我写了一个有关如何执行此操作的BLOG条目:

http://weblogs.asp.net/stevewellens/archive/2009/01/01/from-table-to-treeview-displaying-hierarchies.aspx

我不知道您为什么拥有ParentOfParentID,这似乎是多余的,并且会使将节点移动到另一个父节点真的很困难。

在“节点”下面的代码中,类表示数据库中的一行(不包含将数据库行转换为节点类对象的代码)。

TreeView看起来像这样

<asp:TreeView ID="TreeView1" runat="server" 
onselectednodechanged="TreeView1_SelectedNodeChanged" 
ontreenodecollapsed="TreeView1_TreeNodeCollapsed" 
ontreenodeexpanded="TreeView1_TreeNodeExpanded">
<SelectedNodeStyle BackColor="#FFFFCC" />
</asp:TreeView>

和代码背后的页面如下。 方法“ getTreeMenu()”返回要显示的节点的集合

public class Node
    {
        public int Id;
        public string text;
        public bool IsParent;
        public int parentId;
        public string url;
        public bool IsSelected;
        public bool IsExpanded = false;
    }

    public partial class SiteMaster : System.Web.UI.MasterPage
    {
        List<Node> lstNodes = new List<Node>();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
              bindTree();
            }
        }

        TreeNode searchResult;
        public void SelectNodesRecursive(string searchValue, TreeView Tv)
        {
            foreach (TreeNode tn in Tv.Nodes)
            {
                if (tn.Value == searchValue)
                {
                    searchResult = tn;
                    break;
                }

                if (tn.ChildNodes.Count > 0)
                {
                    foreach (TreeNode cTn in tn.ChildNodes)
                    {
                        int a = SelectChildrenRecursive(cTn, searchValue);
                        if (a == 1)
                        {
                            searchResult = cTn;
                        }
                    }
                }
            }
        }


        private int SelectChildrenRecursive(TreeNode tn, string searchValue)
        {
            if (tn.Value == searchValue)
            {
                searchResult = tn;
                return 1;
            }

            if (tn.ChildNodes.Count > 0)
            {
                foreach (TreeNode tnC in tn.ChildNodes)
                {
                    int a = SelectChildrenRecursive(tnC, searchValue);
                    if (a == 1)
                    {
                        searchResult = tnC;
                        return 1;
                    }

                }

            }
            searchResult = null;
            return 0;
        } 


        private void bindTree()
        {
            TreeNode parent = null, child = null;

            if (Session["TreeNodes"] == null)
            {
                lstNodes = getTreeMenu();
                Session["TreeNodes"] = lstNodes;
            }
            else
            {
                lstNodes = (List<Node>)Session["TreeNodes"];
            }

            foreach (Node node in lstNodes)
            {
                if (node.IsParent && node.parentId == 0)
                {
                    parent = new TreeNode { Text = node.text, Value = node.Id.ToString()};
                    TreeView1.Nodes.Add(parent);
                    parent.Selected = node.IsSelected;
                    parent.Expanded = node.IsExpanded;
                }
                else
                {
                    if (node.IsParent)
                    {
                        SelectNodesRecursive(node.parentId.ToString(), TreeView1);
                        parent = searchResult;
                        child = new TreeNode { Text = node.text, Value = node.Id.ToString()};
                        parent.ChildNodes.Add(child);
                        child.Selected = node.IsSelected;
                        child.Expanded = node.IsExpanded;
                    }
                    else
                    {
                        child = new TreeNode { Text = node.text, Value = node.Id.ToString()};
                        SelectNodesRecursive(node.parentId.ToString(), TreeView1);
                        parent = searchResult;

                        if (parent != null)
                        {
                            parent.ChildNodes.Add(child);
                            child.Selected = node.IsSelected;
                            child.Expanded = node.IsExpanded;
                        }
                        else
                        {
                            child.Selected = node.IsSelected;
                            child.Expanded = node.IsExpanded;
                        }
                    }
                }
            } 
        }

        private List<Node> getTreeMenu()
        {
            List<Node> treeSource = new List<Node>();
        treeSource.Add(new Node { Id = 1, IsParent = true, parentId = 0, text = "parent1", url = "home.aspx?id=1", IsExpanded = true });
        treeSource.Add(new Node { Id = 2, IsParent = false, parentId = 1, text = "Child 1", url = "page1.aspx" });
        treeSource.Add(new Node { Id = 3, IsParent = false, parentId = 1, text = "Child 2", url = "Page2.aspx" });
        treeSource.Add(new Node { Id = 4, IsParent = false, parentId = 1, text = "Child 3", url = "Page3.aspx" });
        treeSource.Add(new Node { Id = 5, IsParent = true, parentId = 0, text = "parent 2", url = "home.aspx?id=5", IsExpanded = false });
        treeSource.Add(new Node { Id = 6, IsParent = false, parentId = 5, text = "child 1", url = "page1.aspx" });
        treeSource.Add(new Node { Id = 7, IsParent = true, parentId = 5, text = "parent 3", url = "home.aspx?id=7", IsExpanded=false });
        treeSource.Add(new Node { Id = 14, IsParent = false, parentId = 7, text = "child 1", url = "page1.aspx" });
        treeSource.Add(new Node { Id = 15, IsParent = false, parentId = 7, text = "child 2", url = "page2.aspx" });
        treeSource.Add(new Node { Id = 8, IsParent = false, parentId = 5, text = "child 3", url = "Page3.aspx" });
        treeSource.Add(new Node { Id = 9, IsParent = true, parentId = 0, text = "parent 4", url = "home.aspx?id=9", IsExpanded = false });
        treeSource.Add(new Node { Id = 10, IsParent = false, parentId = 9, text = "child 1", url = "page1.aspx" });
        treeSource.Add(new Node { Id = 11, IsParent = false, parentId = 9, text = "child 2", url = "Page2.aspx" });
        treeSource.Add(new Node { Id = 12, IsParent = false, parentId = 9, text = "child 3", url = "Page3.aspx" });
        treeSource.Add(new Node { Id = 13, IsParent = true, parentId = 0, text = "parent 5", url = "About.aspx" });
        return treeSource;
        }

        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            string selVal = TreeView1.SelectedValue;
            lstNodes = (List<Node>)Session["TreeNodes"];
            if (lstNodes != null)
            {
                Node nd = lstNodes.Find(n => n.Id.ToString() == selVal);

                foreach (Node item in lstNodes.FindAll(n => n.Id.ToString() != selVal))
                {
                    item.IsSelected = false;
                }

                nd.IsSelected = true;
                Session["TreeNodes"] = lstNodes;
                if (nd.url != "")
                    Response.Redirect(nd.url);
            }
        }

        protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
        {   
            lstNodes = (List<Node>)Session["TreeNodes"];
            if (lstNodes != null)
            {
                Node nd = lstNodes.Find(n => n.Id.ToString() == e.Node.Value);
                nd.IsExpanded = true;
                Session["TreeNodes"] = lstNodes;
            } 
        }

        protected void TreeView1_TreeNodeCollapsed(object sender, TreeNodeEventArgs e)
        {
            lstNodes = (List<Node>)Session["TreeNodes"];

            if (lstNodes != null)
            {
                Node nd = lstNodes.Find(n => n.Id.ToString() == e.Node.Value);
                nd.IsExpanded = false;
                Session["TreeNodes"] = lstNodes;
            }
        }
    }

如果您有任何疑问,请告诉我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM