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];