0

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

ID | ParentID | ParentOfParentID | Name

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

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

谢谢

4

2 回答 2

1

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

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

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

于 2012-10-11T17:03:21.407 回答
0

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

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

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

于 2015-02-06T19:37:06.783 回答