我目前有一个查询,它将数据表返回到 C# 中,其结构如下:
ID | ParentID | ParentOfParentID | Name
我要做的是创建一个函数,将返回的 System.Data.DataTable 链接到 ASP.NET 树视图,以便我得到所描述的结构 - 但到目前为止我没有运气。
任何帮助将不胜感激 - 任何比 ASP“更好”的树视图也会有所帮助!(因为我不太喜欢 ASP)。
谢谢
我写了一篇关于如何做到这一点的博客文章:
我不知道为什么您有 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;
}
}
}
如果您有任何问题,请告诉我