如何将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(); }
额外说明
- 如果你的
CheckedListBox绑定的是自定义对象,而不是字符串,获取文本时需要强转后取对应的属性,比如((YourClass)checkedListBox1.CheckedItems[i]).DisplayName。 - 添加了
Dock = DockStyle.Fill让布局面板填充整个窗体,避免内容因为窗体大小问题被隐藏。 - 增加了
Margin属性优化布局的美观度,你可以根据需要调整。
内容的提问来源于stack exchange,提问作者user11612444
相关产品推荐
相关产品推荐

