C# TreeView循环设置SelectedNode时选中项被覆盖问题
问题原因
TreeView默认是单选模式,SelectedNode是单选场景下的属性,每次给该属性赋值时,控件会自动清除所有已有节点的选中状态,仅保留当前赋值的节点为选中态。
你的代码第一次循环给SelectedNode赋值为值"5"对应的节点,此时"5"节点选中;第二次循环给SelectedNode赋值为值"2"对应的节点时,控件自动清除了"5"的选中状态,最终仅"2"节点保留选中。
多节点同时选中的实现方案
按以下两步修改即可:
- 开启TreeView的多选模式:将控件的
SelectionMode属性设置为TreeViewSelectionMode.Multiple,既可以在XAML界面配置中设置,也可以在后台代码中赋值。 - 替换选中逻辑,操作多选专属的选中节点集合:开启多选后不要再使用
SelectedNode属性赋值,改为调用SelectedNodes集合的Add方法,逐个将匹配到的节点加入选中集合即可,该操作不会清除已有的选中状态。
修正后的完整代码如下:
// 初始化时开启多选 TreeViewYear.SelectionMode = TreeViewSelectionMode.Multiple; // 清空历史选中状态,避免残留无效选中项 TreeViewYear.SelectedNodes.Clear(); foreach (MyClass info in data) { // 用内置方法简化空值判断 if (!string.IsNullOrEmpty(info.year)) { var matchNode = TreeViewYear.RootNodes[0].Children .FirstOrDefault(x => x.Content?.ToString() == info.year); // 匹配到节点才加入选中集合,避免空引用报错 if (matchNode != null) { TreeViewYear.SelectedNodes.Add(matchNode); } } }
注意事项
- 多选模式下
SelectedNode属性仅会返回选中集合里的第一个节点,对其赋值依然会清空所有其他选中项,请勿在多选场景使用该属性修改选中状态。 - 若需要取消某个节点的选中状态,直接调用
SelectedNodes.Remove(目标节点)即可。
内容的提问来源于stack exchange,提问作者Marco Oliveira
相关产品推荐
相关产品推荐

