You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何将TreeView选中的父子节点按规则赋值给二维数组

WinForm TreeView勾选节点存储二维数组空值问题解决方案

核心错误原因

  1. MessageBox参数使用错误
    你调用MessageBox.Show("array -> ", downcause[a,a]);时,第一个参数为弹窗显示内容,第二个参数为弹窗标题。你将数组值作为标题传入,内容区仅显示固定文本,导致你误判数组值为null。
  2. 二维数组未初始化
    C#二维数组为定长结构,声明时必须指定行列长度,未初始化时元素默认值为null,且无法动态调整列数,不符合你动态适配子节点数量的需求。
  3. 子节点赋值逻辑错误
    子节点存储代码写为downcause[a, b] = holdparent;,错误存入父节点值,未存入子节点内容holdchild。
  4. 子节点索引未重置
    索引变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:07