C# 使用列表创建树节点

C# 使用列表创建树节点,c#,list,tree,tree-nodes,C#,List,Tree,Tree Nodes,我有一张这样的桌子 ListA labelName 1 Colorado 1 Wyoming 1 Illinois 2 New York 2 Ohio 我试图创建一棵树,如果LISTA=1,它将位于一个名为“header one”的节点下,并将科罗拉多州、怀俄明州、伊利诺伊州作为其叶子,与值“2”相同。。。通过这样做,我得到了3个“Header one”节点,而不是将所有这三个节点都放在一个节点下 SqlCommand

我有一张这样的桌子

ListA   labelName
  1      Colorado
  1      Wyoming
  1      Illinois
  2      New York
  2      Ohio
我试图创建一棵树,如果LISTA=1,它将位于一个名为“header one”的节点下,并将科罗拉多州、怀俄明州、伊利诺伊州作为其叶子,与值“2”相同。。。通过这样做,我得到了3个“Header one”节点,而不是将所有这三个节点都放在一个节点下

SqlCommand cmd = con.CreateCommand();

        comd.CommandText = "SELECT * FROM myTable";
        con.Open();
        SqlDataReader reader = comd.ExecuteReader();
        while (reader.Read())
        {
            City MyData = new City();

            MyData.ListA = reader["ListA"].ToString().Trim();
            MyData.labelName = reader["labelName"].ToString().Trim();
            giveData.Add(MyData);
        }

        int count = 1;

        List<TreeNode> myNode = new List<TreeNode>();
        foreach (City MyData in giveData)
        {
            // 1st foreach
                if (MyData.ListA != "1")
                {

                    TreeNode treeNode = new TreeNode();
                    treeNode.id = count++;
                    treeNode.name = "Header One";
                    treeNode.leaf = false;

                    List<TreeNode> Level1 = new List<TreeNode>();
                    foreach (City labelName  in giveData)
                    {
                        if (labelName.ListA == "1")
                        {// 2nd foreach
                            TreeNode node1 = new TreeNode();
                            node1.id = count++;
                            node1.name = labelName.labelName;
                            node1.leaf = true;

                            Level1.Add(node1);
                        }
                    }

                    treeNode.children = Level1;
                    myNode.Add(treeNode);
            }
            else if (MyData.ListA != "2")
                {

                    TreeNode treeNode = new TreeNode();
                    treeNode.id = count++;
                    treeNode.name = "Header Two";
                    treeNode.leaf = false;

                    List<TreeNode> Level1 = new List<TreeNode>();
                    foreach (City labelName  in giveData)
                    {
                        if (labelName.ListA == "2")
                        {// 2nd foreach
                            TreeNode node1 = new TreeNode();
                            node1.id = count++;
                            node1.name = labelName.labelName;
                            node1.leaf = true;

                            Level1.Add(node1);
                        }
                    }

                    treeNode.children = Level1;
                    myNode.Add(treeNode);
            }
        }
        return JsonConvert.SerializeObject(myNode);

SqlCommand cmd=con.CreateCommand();
comd.CommandText=“从myTable中选择*”;
con.Open();
SqlDataReader=comd.ExecuteReader();
while(reader.Read())
{
城市MyData=新城市();
MyData.ListA=reader[“ListA”].ToString().Trim();
MyData.labelName=读取器[“labelName”].ToString().Trim();
giveData.Add(MyData);
}
整数计数=1;
List myNode=new List();
foreach(给定数据中的城市MyData)
{
//每小时一次
如果(MyData.ListA!=“1”)
{
TreeNode TreeNode=新的TreeNode();
treeNode.id=count++;
treeNode.name=“标题一”;
treeNode.leaf=false;
列表级别1=新列表();
foreach(给定数据中的城市标签名)
{
如果(labelName.ListA==“1”)
{//2nd foreach
TreeNode1=新的TreeNode();
node1.id=count++;
node1.name=labelName.labelName;
node1.leaf=true;
级别1.添加(节点1);
}
}
treeNode.children=Level1;
添加(treeNode);
}
else if(MyData.ListA!=“2”)
{
TreeNode TreeNode=新的TreeNode();
treeNode.id=count++;
treeNode.name=“头二”;
treeNode.leaf=false;
列表级别1=新列表();
foreach(给定数据中的城市标签名)
{
如果(labelName.ListA==“2”)
{//2nd foreach
TreeNode1=新的TreeNode();
node1.id=count++;
node1.name=labelName.labelName;
node1.leaf=true;
级别1.添加(节点1);
}
}
treeNode.children=Level1;
添加(treeNode);
}
}
返回JsonConvert.SerializeObject(myNode);

处理此问题的最佳方法是将数据分组到
ListA

var groups = giveData.GroupBy(state => state.ListA);

foreach(var group in groups)
{
    //add header to treeview
    string header = group.Key;

    foreach(var state in group)
    {
        //add this state as a child of the group you just added
    }
}
我还建议创建一个查找来帮助您将
ListA
编号映射到它的文本表示:

var headerLookup = new Dictionary<string, string>()
{
    {"1", "Header One"},
    {"2", "Header Two"},
    {"3", "Header Three"}
};

谢谢你。。。我还是无法正确分组。。。另外,headerText似乎不喜欢关键部分…您是否可以通过任何更改获得此类工作样本…@EagleFox说“它不工作”没有任何意义。如果您收到错误消息,请说明它是什么。您没有提供足够的代码供我编写我可以编译的代码,但这将至少几乎完全符合您的要求,您只需根据您未提供的信息进行少量修改。谢谢。。。我不是说你的答案不起作用。。。我的意思是你提到的groupBy方法仍然提供相同的3个节点。。。没有错误。。。虽然我可以通过使用字典来完成这项工作。。。对于文本表示,我只使用了case语句。。。谢谢你的帮助。。。你在回答中提到了字典,我想为什么不在我的整个列表中使用它:)@EagleFox如果你的标题被添加了多次,那么你做了一些不同的事情,或者没有遵循此代码。如果您只在外部
foreach
中添加顶级节点,那么每个头不会有多个节点。Aaaah I C。。。答对 了我错过了第二场比赛。。。不知为什么我只看到一个。。。是的。。。这种方法也很好用。。。非常感谢你抽出时间来服务
string headerText = headerLookup[group.Key];