C# WinForms基于SQL表构建地区-国家-城市层级TreeView求助
实现三级TreeView层级结构(嵌套循环+条件语句)
没问题,我来帮你搞定这个三级TreeView的构建!核心思路就是按「地区→国家→城市」的层级,先去重分组,再逐层嵌套遍历添加节点。下面是具体的实现方法,用嵌套循环+条件语句就能搞定:
前提假设
假设你已经有:
- 一个名为
dt的DataTable,包含REGION、NATION、CITY三个字段 - WinForms中的TreeView控件,名为
treeView1
代码实现
// 1. 先收集所有不重复的地区,避免创建重复的一级节点 List<string> uniqueRegions = new List<string>(); foreach (DataRow row in dt.Rows) { string region = row["REGION"].ToString().Trim(); // 条件判断:如果地区不在列表里,就添加进去 if (!uniqueRegions.Contains(region)) { uniqueRegions.Add(region); } } // 遍历每个地区,创建一级节点 foreach (string region in uniqueRegions) { TreeNode regionNode = new TreeNode(region); treeView1.Nodes.Add(regionNode); // 2. 收集当前地区下所有不重复的国家 List<string> uniqueNations = new List<string>(); foreach (DataRow row in dt.Rows) { string currentRegion = row["REGION"].ToString().Trim(); string nation = row["NATION"].ToString().Trim(); // 条件判断:匹配当前地区,且国家未被收集过 if (currentRegion.Equals(region, StringComparison.OrdinalIgnoreCase) && !uniqueNations.Contains(nation)) { uniqueNations.Add(nation); } } // 遍历每个国家,创建二级节点 foreach (string nation in uniqueNations) { TreeNode nationNode = new TreeNode(nation); regionNode.Nodes.Add(nationNode); // 3. 收集当前地区+国家下的所有城市,创建三级节点 foreach (DataRow row in dt.Rows) { string currentRegion = row["REGION"].ToString().Trim(); string currentNation = row["NATION"].ToString().Trim(); string city = row["CITY"].ToString().Trim(); // 条件判断:同时匹配当前地区和国家 if (currentRegion.Equals(region, StringComparison.OrdinalIgnoreCase) && currentNation.Equals(nation, StringComparison.OrdinalIgnoreCase)) { TreeNode cityNode = new TreeNode(city); nationNode.Nodes.Add(cityNode); } } } }
关键细节解释
- 去重逻辑:每一层都先收集不重复的父节点(地区、国家),避免出现同一个地区/国家被多次添加的情况;
- 大小写兼容:用
StringComparison.OrdinalIgnoreCase做匹配,避免因为大小写差异(比如"Europe"和"europe")导致的分组错误,如果不需要可以换成普通的Equals(region); - 层级嵌套:三层循环对应三级节点,每一层都通过条件判断筛选出当前父节点下的子数据,保证层级关系正确。
如果你的数据量很大,也可以先对DataTable按REGION、NATION排序,这样遍历的时候可以提前跳出重复判断,提升一点性能,但对于常规数据量,上面的代码完全够用。
内容的提问来源于stack exchange,提问作者Paradix
相关产品推荐
相关产品推荐

