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

C# WinForm中如何在Label中打印字符串数组指定元素?

解决C# WinForm中Label仅显示最后选中数组元素的问题

我来帮你拆解下问题,然后给出几个实用的解决方案:

问题根源分析

  1. 空引用风险与冗余逻辑:你在Form2里用Form1.names[i].Equals(names2[i])做判断,但Form1的names数组中未被选中的元素是null,直接调用Equals会触发NullReferenceException——这很可能是你试了+=也没得到预期结果的核心原因。另外,names2数组完全是多余的:Form1的names里已经存储了选中的name1/name2/name3,没必要再和固定数组做对比。
  2. 文本覆盖问题:最初用label1.Text = names2[i] + "\n"时,每次赋值都会覆盖之前的文本,所以最终只会显示最后一个匹配项。

解决方案1:直接遍历数组收集非空元素

修改Form2的Load事件代码,直接遍历Form1的names数组,把非空的选中项追加到Label中:

private void Form2_Load(object sender, EventArgs e)
{
    // 先清空Label默认文本,避免干扰
    label1.Text = string.Empty;
    
    foreach (var name in Form1.names)
    {
        // 只处理已选中的非空元素
        if (!string.IsNullOrEmpty(name))
        {
            label1.Text += name + Environment.NewLine;
        }
    }
}

解决方案2:用StringBuilder优化拼接(推荐)

如果数组元素较多,多次用+=拼接字符串会产生额外内存开销,用StringBuilder更高效:

using System.Text; // 需要引入这个命名空间

private void Form2_Load(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    
    foreach (var name in Form1.names)
    {
        if (!string.IsNullOrEmpty(name))
        {
            sb.AppendLine(name); // AppendLine自动添加换行符
        }
    }
    
    label1.Text = sb.ToString();
}

解决方案3:用LINQ快速过滤拼接(简洁写法)

如果你熟悉LINQ,一行代码就能搞定:

using System.Linq; // 需要引入这个命名空间

private void Form2_Load(object sender, EventArgs e)
{
    // 过滤空元素,用换行符连接成最终文本
    label1.Text = string.Join(Environment.NewLine, Form1.names.Where(n => !string.IsNullOrEmpty(n)));
}

额外优化:避免用静态变量传递数据

静态数组虽然能实现数据传递,但会长期驻留内存,容易导致意外的状态共享。更优雅的方式是通过Form2的构造函数传递数据:

  • Form1中修改按钮点击事件:
private void button_Click(object sender, EventArgs e)
{
    // 你的赋值逻辑...
    this.Hide();
    // 把数组作为参数传给Form2的构造函数
    Form2 frm2 = new Form2(Form1.names);
    frm2.Show();
}
  • Form2中修改构造函数和Load事件:
private string[] _selectedNames;

// 自定义构造函数接收传递的数组
public Form2(string[] selectedNames)
{
    InitializeComponent();
    _selectedNames = selectedNames;
}

private void Form2_Load(object sender, EventArgs e)
{
    label1.Text = string.Join(Environment.NewLine, _selectedNames.Where(n => !string.IsNullOrEmpty(n)));
}

小建议:优化Form1的赋值逻辑

可以用switch代替多个if,代码更清晰易维护:

private void button_Click(object sender, EventArgs e)
{
    switch(label1.Text)
    {
        case "meal1":
            names[0] = "name1";
            break;
        case "meal2":
            names[1] = "name2";
            break;
        case "meal3":
            names[2] = "name3";
            break;
        // 可选:处理未知的文本情况
        default:
            // 比如提示用户选择无效
            break;
    }
    this.Hide();
    Form2 frm2 = new Form2(names);
    frm2.Show();
}

内容的提问来源于stack exchange,提问作者Mazen Al-ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:03:13