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

如何将CheckedListBox选中项添加至新窗体并生成Label与TextBox

问题分析与修复方案

我帮你梳理下代码里的几个关键问题,这些问题直接导致新窗体没有显示内容,且标签文本不符合预期:

核心问题点

  • 数组初始化位置错误:你在for循环内部每次都重新创建txtBox和labels数组,这会覆盖之前循环中创建的控件引用,导致大部分控件丢失。
  • 选中项文本获取错误:用i.ToString()设置标签文本完全不对,你需要从CheckedListBox的选中项中获取实际的文本内容。
  • 控件添加到了错误窗体:你把tableLayoutPanel添加到了当前窗体的Controls集合,而不是新创建的testForm中,这是新窗体为空的根本原因!
  • 布局逻辑冗余:每个项重复添加行样式,其实可以用两列布局,让Label和TextBox在同一行的不同列,更符合预期。

修复后的完整代码

private void Button4_Click(object sender, EventArgs e)
{
    // 创建新窗体实例
    testForm = new Test();
    
    // 初始化TableLayoutPanel并设置布局
    TableLayoutPanel tableLayoutPanel = new TableLayoutPanel() 
    { 
        AutoSize = true,
        Dock = DockStyle.Fill, // 让布局面板填充窗体,避免内容被截断
        ColumnCount = 2 // 设置两列,一列放Label,一列放TextBox
    };
    tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
    tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); // 让TextBox占剩余空间
    
    // 获取选中项数量,提前初始化控件数组(也可以不用数组,直接创建控件添加即可)
    int checkedCount = checkedListBox1.CheckedItems.Count;
    TextBox[] txtBox = new TextBox[checkedCount];
    Label[] labels = new Label[checkedCount];
    
    for (int i = 0; i < checkedCount; i++)
    {
        // 获取当前选中项的文本
        string itemText = checkedListBox1.CheckedItems[i].ToString();
        // 如果是自定义对象,需要改成对应的属性,比如:((YourObject)checkedListBox1.CheckedItems[i]).Name
        
        // 创建Label并设置文本
        labels[i] = new Label();
        labels[i].Text = itemText;
        labels[i].AutoSize = true;
        labels[i].Margin = new Padding(5); // 增加边距,布局更美观
        
        // 创建TextBox
        txtBox[i] = new TextBox();
        txtBox[i].Margin = new Padding(5);
        
        // 添加行样式(每行对应一个选中项)
        tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        
        // 将Label添加到第0列,当前行
        tableLayoutPanel.Controls.Add(labels[i], 0, i);
        // 将TextBox添加到第1列,当前行
        tableLayoutPanel.Controls.Add(txtBox[i], 1, i);
    }
    
    // 把布局面板添加到新窗体的Controls集合
    testForm.Controls.Add(tableLayoutPanel);
    // 显示新窗体
    testForm.ShowDialog();
}

额外说明

  1. 如果你的CheckedListBox绑定的是自定义对象,而不是字符串,获取文本时需要强转后取对应的属性,比如((YourClass)checkedListBox1.CheckedItems[i]).DisplayName。
  2. 添加了Dock = DockStyle.Fill让布局面板填充整个窗体,避免内容因为窗体大小问题被隐藏。
  3. 增加了Margin属性优化布局的美观度,你可以根据需要调整。

内容的提问来源于stack exchange,提问作者user11612444

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:05