如何动态解析数据列表并在树视图中显示结果

如何解决如何动态解析数据列表并在树视图中显示结果

我有一个带有属性的对象列表。对象类如下所示:

public class ElementImpression
{
    public int ElementId { get; private set; }
    public string FamilyAndTypeName { get; private set; }
    public string CategoryName { get; private set; }
    public int CategoryNumber { get; private set; }
    public string SystemAbbreviation { get; private set; }
    public ElementImpression(Element e)
    {
        ElementId = e.Id.IntegerValue;
        FamilyAndTypeName = e.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_ParaM).AsValueString();
        CategoryName = e.Category.Name;
        CategoryNumber = e.Category.Id.IntegerValue;
        SystemAbbreviation = e.get_Parameter(BuiltInParameter.RBS_DUCT_PIPE_SYstem_ABBREVIATION_ParaM).Asstring();
    }
}

目标是解析列表并在TreeView控件中创建结构化的层次结构表示。用户在运行时定义层次结构中的级别数以及用作节点的属性。 我成功创建了以下树视图: Treeview通过使用以下代码

private void UpdateTreeView(object sender,MyEventArgs e)
    {
        //Level 0: All
        //Level 1: System Abbreviation
        //Level 2: Category Name
        //Level 3: Family and Type Name

        treeView1.BeginUpdate();
        treeView1.Nodes.Clear();
        
        //Payload is a container object holding the list to be parsed. It is cached as a property in the form.
        //Payload.ElementsInSelection is the list of objects to parse.
        var lv1Group = Payload.ElementsInSelection.GroupBy(x => x.SystemAbbreviation);
        treeView1.Nodes.Add("All");

        int i = -1;
        foreach (IGrouping<string,ElementImpression> group1 in lv1Group)
        {
            treeView1.Nodes[0].Nodes.Add(group1.Key);

            var lv2Group = group1.ToList().GroupBy(x => x.CategoryName);

            i++;
            int j = -1;
            foreach (IGrouping<string,ElementImpression> group2 in lv2Group)
            {
                treeView1.Nodes[0].Nodes[i].Nodes.Add(group2.Key);

                var lv3Group = group2.ToList();

                j++;
                int k = -1;
                foreach (ElementImpression ei in lv3Group)
                {
                    k++;
                    treeView1.Nodes[0].Nodes[i].Nodes[j].Nodes.Add(ei.FamilyAndTypeName);

                    treeView1.Nodes[0].Nodes[i].Nodes[j].Nodes[k].Nodes.Add(ei.ElementId.ToString());
                    treeView1.Nodes[0].Nodes[i].Nodes[j].Nodes[k].Nodes.Add(ei.CategoryNumber.ToString());
                }
            }
        }
        treeView1.EndUpdate();
    }

是否可以重写UpdateTreeView()方法,以便它接受某种对象,该对象告诉该方法使用多少级和哪些属性,然后解析数据并在运行时动态创建树视图?可以使用递归吗?

解决方法

好吧,我设法找到了解决方案。它不是递归的,而是动态的。可以在运行时添加或删除属性,以下代码应解析属性并填充树。

通常的想法是遍历所有需要组织以确定最深层节点FullPath的对象。因为我使用属性值作为节点,所以每个对象已经拥有其FullPath子部分。它们只需要按正确的顺序组合即可。

然后,从手动添加的顶级根节点开始,遍历路径的每一步,以检查该节点是否存在以及是否不创建它。此方法可以根据需要在树视图中成功呈现我的数据。

FindTreeNodeByFullPath()方法来自here

public void PopulateTreeview()
    {
        //Manually add root node
        treeView1.Nodes.Add("All");
        
        //Loop all the objects
        foreach (ElementImpression e in Elements)
        {
            //Declare array to hold the names of all nodes in path to the element
            //PropertiesList is an object containing information about what properties to consider and how many.
            string[] pathParts = new string[PropertiesList.Length + 2];

            //The name of root node
            pathParts[0] = "All";

            //Populate the path parts with values from elements
            for (int i = 0; i < PropertiesList.Length; i++)
            {
                pathParts[i + 1] = PropertiesList[i].getPropertyValue(e);
            }
            //Finish the list with the name of the element (id currently)
            pathParts[pathParts.Length - 1] = e.Id.IntegerValue.ToString();

            //Create an array of all full paths from root node to the element
            string[] fullPaths = new string[PropertiesList.Length + 2];
            for (int i = 0; i < fullPaths.Length; i++)
            {
                if (i == 0) fullPaths[i] = pathParts[i];
                else fullPaths[i] = fullPaths[i - 1] + "." + pathParts[i];
            }

            //Iterate through the fullPaths to determine,if node exists,if not -> create it
            TreeNode previousNode = null;
            for (int i = 0; i < fullPaths.Length; i++)
            {
                TreeNode foundNode = treeView1.Nodes.FindTreeNodeByFullPath(fullPaths[i]);
                if (foundNode == null)
                {
                    if (previousNode != null) previousNode = previousNode.Nodes.Add(pathParts[i]);
                }
                else
                {
                    previousNode = foundNode;
                    continue;
                }
            }
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?