【问题标题】:ASP.NET Treeview generated from SQL query从 SQL 查询生成的 ASP.NET Treeview
【发布时间】:2012-10-11 17:00:28
【问题描述】:

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

ID | ParentID | ParentOfParentID | Name

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

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

谢谢

【问题讨论】:

标签: c# asp.net treeview


【解决方案1】:

我写了一篇关于如何做到这一点的博客文章:

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

我不知道您为什么有 ParentOfParentID,这似乎是多余的,并且会使将节点移动到不同的父级非常困难。

【讨论】:

    【解决方案2】:

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

    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;
                }
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 2020-06-06
      • 1970-01-01
      • 2012-06-20
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多