尝试使用递归子项使哈希集动态化以从 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仁
我在尝试从 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仁