尝试使用递归子项使哈希集动态化以从 Mudblazor 填充 Treeview

Trying to make a hashset dynamic with recursive children to populate a Treeview from Mudblazor

我在尝试从 Mudblazor 填充 Mudtree 时遇到问题。

我目前的代码是这样的:

protected override async Task OnInitializedAsync()
{
    Devices = await httpClient.GetFromJsonAsync<List<Device>>("https://localhost:8443/api/device");
    DeviceGroups = await httpClient.GetFromJsonAsync<List<DeviceGroup>>("https://localhost:8443/api/group");


    TreeItemData rootTreeItem = new TreeItemData("Root", Icons.Filled.Computer)
        {
            IsExpanded = true
        };
    TreeItems.Add(rootTreeItem);

    rootTreeItem.TreeItems = new HashSet<TreeItemData>() { };
    foreach (var group in DeviceGroups)
    {
        if (group.ChildGroups != null)
        {
            foreach (DeviceGroup childgroup in group.ChildGroups)
            {

                rootTreeItem.TreeItems.Add(new TreeItemData(group.Name, Icons.Filled.Computer)
                    {
                        IsExpanded = true,
                        TreeItems = new HashSet<TreeItemData>()
                    {
                        new TreeItemData(childgroup.Name, Icons.Filled.Computer)
                        {
                            IsExpanded = true,

                        }
                    }
                });
            }
        }
        else if (group.ParentGroup != null)
        {

        }
        else
        {
            rootTreeItem.TreeItems.Add(new TreeItemData(group.Name, Icons.Filled.Computer));
        }
    }

}

现在的问题是子组本身被添加为主要组,我不确定如何递归地将子组添加到哈希集。我试图让它基本上看起来像一个文件资源管理器,但它不是文件,而是简单的组和“设备”。

我已经努力思考了大约一个星期,但找不到有效的解决方案。

Mudblazor Mudtree showing the items all being main groups

我必须使用哈希集,因为我将数据绑定到来自 Mudblazor 的 Treeview。期望的结果将是这样的:

Image showing the Treeview with recursive children

这是数据库中的组的图像:

Image showing the database relations with the parent group IDs

我无法计算出你的 parent-first 从你的数据库(一个无组织的列表)构建你的树的策略。如果您不打算让数据库以合适的方式对您的数据进行排序(例如,每个 parent 在 children 之前遇到),您将需要处理“确保parent 存在于客户端的 child" 之前。将所有节点加载到可以查找它们的内存中可能是最简单的,然后 运行 再次在它们之上建立节点之间的连接。

var map = new Dictionary<Guid, TreeItemData>();

//make a root note (the data in the db doesn't contain it)
map[Guid.Empty] = new TreeItemData("Root", Icons.Filled.Computer){ IsExpanded = true, TreeItems = new() };
TreeItems.Add(seen[Guid.Empty]);

var nodes = get_nodes_from_db....

//create a map that knows about every node in the data and maps to a TreeItemData
foreach(var node in nodes)
    map[node.GroupId] = new TreeItemData(node.Name, Icons.Filled.Computer){ IsExpanded = true, TreeItems = new() };

//now we know about every node, we can link parents to children
foreach(var node in nodes)
    map[node.ParentGroupGroupId].TreeItems.Add(map[node.GroupId]);

第一个循环通过其 ID 创建每个节点。然后第二个循环可以确保任何给定的 ParentId 确实存在于地图中,因此它可以直接访问它,并将当前 TreeItem 添加为 child of that parent treeitem

本质上 map 是从 GroupId 到 TreeItemData 的索引,因此很容易说“查找此 parent X,然后将此 child Y 添加到 X 的 child仁

https://try.mudblazor.com/snippet/QEcGEylQQgshnOUL