C# 在win窗体上动态添加元素?

C# 在win窗体上动态添加元素?,c#,winforms,C#,Winforms,我有两张表格。单击form1上的按钮打开form2,用户在其中添加详细信息并返回form1,信息存储到列表中,并创建文本框和界面的其他元素 我有5个不同级别的标签,但添加的信息是相同的 如何避免使用 if (level==5) {//do this whole code again} 添加的元素示例: int _nextTextBoxTop=15; List<TextBox> CodesMy = new List<TextBox>(); var code = new

我有两张表格。单击form1上的按钮打开form2,用户在其中添加详细信息并返回form1,信息存储到
列表中,并创建文本框和界面的其他元素

我有5个不同级别的标签,但添加的信息是相同的

如何避免使用

if (level==5) {//do this whole code again}
添加的元素示例:

int _nextTextBoxTop=15;
List<TextBox> CodesMy = new List<TextBox>();

var code = new TextBox();
CodesMy.Add(code);
code.Location = new Point(12, _nextTextBoxTop);
_nextTextBoxTop += 36;
code.Size = new Size(80, 25);
code.Text = mcode;
tabPageLevel5.Controls.Add.Controls.Add(code); 
int\u nexttexboxtop=15;
列表代码smy=新列表();
var代码=新文本框();
代码my.Add(代码);
代码位置=新点(12,_nextTextBoxTop);
_nextTextBoxTop+=36;
代码尺寸=新尺寸(80,25);
code.Text=mcode;
tabPageLevel5.Controls.Add.Controls.Add(代码);

最简单的解决方案是将元素创建重构为一个单独的函数,如下所示:

CreateControls(TabPage tabPage)
{
var code = new TextBox();
CodesMy.Add(code);
code.Location = new Point(12, _nextTextBoxTop);
_nextTextBoxTop += 36;
code.Size = new Size(80, 25);
code.Text = mcode;
tabPage.Controls.Add.Controls.Add(code);     
}
然后,您的客户端代码将如下所示:

if (level==5) {CreateControls(tabPageLevel5);}
与动态添加控件相比,更简单的方法是创建在每个选项卡页面上使用的用户控件


即使您需要动态添加控件,您仍然可以使用用户控件进行添加,并在每次添加选项卡页时对其进行克隆。

您不应该绝对指定位置。创建一个
FlowLayoutPanel
,只需将每个新的文本框(或包含所有表示要添加的新“内容”的控件的usercontrol)添加到该面板中,以便将它们添加到上一个文本框的正下方


根据要将它们添加到哪个选项卡,添加它们的
FlowLayoutPanel
可能会有所不同。您可以将其作为方法的参数,类似于Paul的建议,或者您可以使用变量
currentTab
PanelIncirentTab
或类似的适当设置,然后使用一个方法将新控件添加到该容器中。

这很好,我只是想避免克隆这个或者它不可能,好的。我还有一个问题,虽然控件是相同的列表,但添加的元素是不同的,因为我需要访问特定的元素来进行计算。所以我有:列表代码smy=newlist();列表代码MY2=新列表();。。。。。。有多种方法可以解决这个问题。2D文本框数组或类似的列表:列表我可以有3D、4D数组还是只有2D是的,你可以添加任意多的维度:它们不是绝对的,它们是GroupBox的一部分,但我没有复制相同的代码。编辑代码