C#删除动态添加的文本框,并向下移动所有其他文本框

C#删除动态添加的文本框,并向下移动所有其他文本框,c#,winforms,C#,Winforms,我真的为这个问题挣扎了很长时间 我在tab press上添加了一个文本框和一个按钮。我将文本放在文本框中: 现在,我的问题是,如何删除我单击的按钮旁边的文本框,并向下移动所有文本框,这样我就不会得到任何开放空间。如果我按下第7个文本框旁边的按钮,我希望它看起来像这样: 这是我的密码: private void Form1_Load(object sender, EventArgs e) { //creates a textbox(t0) and a button(b0

我真的为这个问题挣扎了很长时间

我在tab press上添加了一个文本框和一个按钮。我将文本放在文本框中:

现在,我的问题是,如何删除我单击的按钮旁边的文本框,并向下移动所有文本框,这样我就不会得到任何开放空间。如果我按下第7个文本框旁边的按钮,我希望它看起来像这样:

这是我的密码:

private void Form1_Load(object sender, EventArgs e)
    {
        //creates a textbox(t0) and a button(b0) on load
        TextBox t0 = new TextBox();
        t0.Name = "t0";
        t0.Location = new Point(16, 12);
        t0.Width = 200;
        t0.PreviewKeyDown += new PreviewKeyDownEventHandler(PreviewKeyDown);

        Button b0 = new Button();
        b0.TabStop = false;
        b0.Text = "x";
        b0.Location = new Point(216, 11);
        b0.Size = new System.Drawing.Size(20, 22);
        b0.Click += new EventHandler(buttonclicked);

        panel1.Controls.Add(t0);
        panel1.Controls.Add(b0);
    }



    private new void PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        //if I press tab in the last textbox it creates a new textbox(t + amount of textboxes) and button(b + amount of textboxes)
        if (e.KeyData == Keys.Tab)
        {
            int counter2 = 0;
            foreach (TextBox box in panel1.Controls.OfType<TextBox>())
            {
                counter2++;
            }

            counter2 = counter2 - 1;
            string Name = "t" + Convert.ToString(counter2);
            counter2++;
            foreach (TextBox box in panel1.Controls.OfType<TextBox>())
            {
                if (Name == box.Name && box.Focused)
                {
                    TextBox t0 = new TextBox();
                    Button b0 = new Button();

                    t0.Location = new Point(16, 12 + counter - panel1.VerticalScroll.Value);
                    t0.Width = 200;
                    t0.Name = "t" + Convert.ToString(counter2);
                    t0.PreviewKeyDown += new PreviewKeyDownEventHandler(PreviewKeyDown);

                    b0.TabStop = false;
                    b0.Text = "x";
                    b0.Name = "b" + Convert.ToString(counter2);
                    b0.Location = new Point(216, 11 + counter - panel1.VerticalScroll.Value);
                    b0.Size = new System.Drawing.Size(20, 22);
                    b0.Click += new EventHandler(buttonclicked);

                    panel1.Controls.Add(t0);
                    panel1.Controls.Add(b0);

                    counter = counter + 25;
                }
            }
        }
    }


    private void buttonclicked(object sender, EventArgs e)
    {
        //Remove the textbox next to it.
    }
private void Form1\u加载(对象发送方,事件参数e)
{
//在加载时创建文本框(t0)和按钮(b0)
TextBox t0=新的TextBox();
t0.Name=“t0”;
t0.位置=新点(16,12);
t0.宽度=200;
t0.PreviewKeyDown+=新的PreviewKeyDownEventHandler(PreviewKeyDown);
按钮b0=新按钮();
b0.TabStop=false;
b0.Text=“x”;
b0.位置=新点(216,11);
b0.尺寸=新系统图纸尺寸(20,22);
b0.单击+=新建事件处理程序(按钮单击);
面板1.控件。添加(t0);
面板1.控件。添加(b0);
}
private new void PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e)
{
//如果我在最后一个文本框中按tab键,它将创建一个新的文本框(t+文本框数量)和按钮(b+文本框数量)
if(e.KeyData==Keys.Tab)
{
int计数器2=0;
foreach(panel1.Controls.OfType()中的文本框)
{
计数器2++;
}
计数器2=计数器2-1;
string Name=“t”+Convert.ToString(计数器2);
计数器2++;
foreach(panel1.Controls.OfType()中的文本框)
{
if(Name==box.Name&&box.Focused)
{
TextBox t0=新的TextBox();
按钮b0=新按钮();
t0.位置=新点(16,12+计数器面板1.垂直滚动.值);
t0.宽度=200;
t0.Name=“t”+转换为字符串(计数器2);
t0.PreviewKeyDown+=新的PreviewKeyDownEventHandler(PreviewKeyDown);
b0.TabStop=false;
b0.Text=“x”;
b0.Name=“b”+转换为字符串(计数器2);
b0.位置=新点(216,11+计数器面板1.垂直滚动.值);
b0.尺寸=新系统图纸尺寸(20,22);
b0.单击+=新建事件处理程序(按钮单击);
面板1.控件。添加(t0);
面板1.控件。添加(b0);
计数器=计数器+25;
}
}
}
}
private void按钮已单击(对象发送方,事件参数e)
{
//删除它旁边的文本框。
}
非常感谢您的帮助

我建议您使用。将TableLayoutPanel上的
GrowthStyle
设置为
AddRows
AddColumns
,然后可以向其添加/删除控件,它将自动调整大小。将每行的高度设置为略大于文本框高度的数字。将列宽设置为一个值,以便文本框和按钮可以放入其中。您需要在其中包含两列

不需要将控件的位置设置为静态位置。它们将由
TableLayoutPanel
为您处理

下面是如何向其中添加新控件

yourTableLayoutPanel.Controls.Add(yourTextbox1, 0 /* Column Index */, 0 /* Row index */);

非常感谢你!经过这么长时间的工作,这种简单的伎俩奏效了。顺便说一句,我只需要一列和两行。对不起,我没有足够的代表点数来投票。很高兴它成功了。不用担心,伙计,你很快就会有很多这样好的态度。