C# 如何将TreeView选中的父子节点按规则赋值给二维数组
WinForm TreeView勾选节点存储二维数组空值问题解决方案
核心错误原因
- MessageBox参数使用错误
你调用MessageBox.Show("array -> ", downcause[a,a]);时,第一个参数为弹窗显示内容,第二个参数为弹窗标题。你将数组值作为标题传入,内容区仅显示固定文本,导致你误判数组值为null。 - 二维数组未初始化
C#二维数组为定长结构,声明时必须指定行列长度,未初始化时元素默认值为null,且无法动态调整列数,不符合你动态适配子节点数量的需求。 - 子节点赋值逻辑错误
子节点存储代码写为downcause[a, b] = holdparent;,错误存入父节点值,未存入子节点内容holdchild。 - 子节点索引未重置
索引变量b定义在循环外层,遍历完第一个父节点的子节点后b不会重置为1,后续父节点的子节点存储位置会错位。
修复方案
方案1:调整现有二维数组逻辑
首先在窗体类中提前初始化二维数组(根据业务上限设置足够的行列数,示例为最多10个父节点,每个父节点最多20个子节点):
// 窗体类全局声明 string[,] downcause = new string[10, 21];
修改按钮点击事件代码:
private void button1_Click(object sender, EventArgs e) { int a = 0; foreach (TreeNode tn in treeView1.Nodes) { if (tn.Checked) { // 每个父节点遍历前重置子节点索引 int b = 1; string holdparent = tn.Text; downcause[a, 0] = holdparent; // 修正MessageBox写法 MessageBox.Show(holdparent); MessageBox.Show("array -> " + downcause[a, 0]); foreach (TreeNode child in tn.Nodes) { if (child.Checked) { string holdchild = child.Text; // 修正赋值为子节点内容 downcause[a, b] = holdchild; MessageBox.Show(holdchild); MessageBox.Show("array -> " + downcause[a, b]); b++; } } a++; } } }
方案2:使用嵌套List替代二维数组(更适配动态长度需求)
嵌套List支持动态扩容,无需提前固定长度,更适合你不确定子节点数量的场景,结构和你要求的一致:每个子List的第一个元素为父节点,后续元素为对应选中子节点。
窗体类全局声明:
List<List<string>> downcause = new List<List<string>>();
按钮点击事件代码:
private void button1_Click(object sender, EventArgs e) { // 每次点击清空之前的存储内容 downcause.Clear(); foreach (TreeNode tn in treeView1.Nodes) { if (tn.Checked) { List<string> nodeGroup = new List<string>(); // 存入父节点 nodeGroup.Add(tn.Text); foreach (TreeNode child in tn.Nodes) { if (child.Checked) { // 存入选中子节点 nodeGroup.Add(child.Text); } } downcause.Add(nodeGroup); } } // 遍历验证结果示例 foreach(var group in downcause) { MessageBox.Show($"父节点:{group[0]},选中子节点数量:{group.Count - 1}"); } }
内容的提问来源于stack exchange,提问作者Northbama
相关产品推荐
相关产品推荐

