我正在尝试使用自引用表字段创建TreeView嵌套结构。这是一个简单的例子:
Category 1
Product 1
Toy 1
Toy 2
Product 2
Toy 3
Toy 4
更多类别..
数据库表有一个名为“Category”的表。 ParentCategoryId指向作为父类的类别。因此,对于类别1,ParentCategoryId为null,因为它是父类。对于产品1,ParentCategoryId是类别1的ID,而对于玩具1,ParentCategoryId是产品1的ID。
我使用以下代码,但它不能成功生成TreeView(ASP.NET)。
public void BuildTree(List<Category> categories, TreeNode treeNode)
{
if (treeNode == null) return;
TreeNode tnAdd = null;
var categoryId = Guid.NewGuid();
foreach (var category in categories)
{
if (category.IsBaseCategory)
{
tnAdd = new TreeNode();
tnAdd.Text = category.Description;
BuildTree((from c in categories
where c.ParentCategoryId == category.CategoryId
select c).ToList<Category>(), tnAdd);
}
else
{
tnAdd = new TreeNode();
tnAdd.Text = category.Description;
BuildTree((from c in categories
where c.ParentCategoryId == category.CategoryId
select c).ToList<Category>(), tnAdd);
}
if (tnAdd != null)
treeNode.ChildNodes.Add(tnAdd);
}
}
这是否需要递归!
这是我得到的结果:
80W
40W
40W
Light Bulbs
Flourecent
Incedecent
60W
80W
60W
Flourecent
40W
80W
60W
Incedecent
80W
40W
60W
答案 0 :(得分:0)
什么不成功? 如果是因为你看到 nothing ...我看不到你将根节点添加到实际树控件的位置。需要将tnAdd添加到某个树控件中。
如果是因为你没有得到你所期望的一切:除非你已经在某个地方进行了递归并且没有意识到这一点,否则我无法看到上述代码将如何进入玩具级别。你在上面的代码中说“base”,然后是“child”,它涵盖了两个层次。您的样本数据中有三个级别,因此在某些时候您需要考虑添加玩具。如果需要 n 级别,可以递归编写它。如果你只有三个级别,你可以重复一遍。
----- OP更新的更新
查看您的代码,您拥有的是:
for each category {
if it is base
add its children
else if it is not base
add its children
add it to the tree
}
这意味着每个项目都会在第一个foreach中被命中并添加到树中,而不是每个级别。 你想要的是
for each category{
if it is base
add base's children
for each child [
add child's children
add child to the tree
]
add base the tree
}
接近这一点(我现在没时间测试,对不起)应该接近工作
public BuildTreeTop(List<Category> categories, TreeNode treeNode)
{
BuildTree((from c in categories
where c.IsBaseCategory == true
select c).ToList<Category>(), categories, tnAdd);
}
public void BuildTree(List<Category> currentLevel, List<Category> allCategories, TreeNode treeNode)
{
if (treeNode == null) return;
TreeNode tnAdd = null;
var categoryId = Guid.NewGuid();
foreach (var category in currentLevel)
{
tnAdd = new TreeNode();
tnAdd.Text = category.Description;
BuildTree((from c in allCategories
where c.ParentCategoryId == category.CategoryId
select c).ToList<Category>(), allCategories, tnAdd);
if (tnAdd != null)
treeNode.ChildNodes.Add(tnAdd);
}
}