删除某些控件后如何在文本框之间删除(删除)space?

How to delete (remove) space between textboxes after remove some controls?

我是 C# 的新手,我在这里提问是因为我没有在 google 中找到解决方案以及其他关于 SO 的问题,我将解释我的示例应用程序的作用:

当我运行它默认显示一个带有文本框的表单,这个文本框总是会显示,在输入一些文本并按回车后它会生成一个新的文本框和一个新的按钮(所有控制甚至默认文本框都在面板内),并且新文本框具有与默认文本框相同的功能,当我单击其文本框旁边生成的按钮时,它会删除按钮本身和文本框,但之后如果我删除一些随机文本框在这些控件之间留下 space,如何重新组织此内容以不让它们之间出现 space?

正如你在图片中看到的,你能告诉我如何解决这个问题或者给我一个建议来实现这个目标吗?谢谢,顺便说一句,这是我用来生成按钮和文本框的方法

private void GenerarTextBox()
{
    panelContenedor.VerticalScroll.Value = panelContenedor.VerticalScroll.Minimum;

    TextBox tb = new TextBox();
    tb.Text = "Prueba " + id;
    tb.Name = "txtBox" + id;
    tb.KeyDown += new KeyEventHandler(TextBox_Keydown);

    Button bt = new Button();
    bt.Cursor = Cursors.Hand;
    bt.Text = "X";
    bt.Name = "btnPrueba" + id;
    bt.Click += new EventHandler(ClickBotones);

    Point p = new Point(20, 30 * id);
    Point pb = new Point(130, 30 * id);

    tb.Location = p;
    bt.Location = pb;

    panelContenedor.Controls.Add(tb);
    panelContenedor.Controls.Add(bt);

    tb.Focus();
    id++;
}

然后删除文本框和按钮

private void ClickBotones(object sender, EventArgs e)
{
    Button bt = sender as Button;

    string nombreBoton = bt.Name;
    string idBoton = nombreBoton.Substring(9);
    string nombreTextBox = "txtBox" + idBoton;

    foreach (Control item in panelContenedor.Controls.OfType<Control>())
    {
        if (item.Name == nombreTextBox)
        {
            panelContenedor.Controls.Remove(item);
            panelContenedor.Controls.Remove(bt);
        }
    }
}

删除控件时,需要重新计算位置。因此,当您按顺序添加它们时,您可以使用:

bool repos = false;
Point p;
foreach (Control item in panelContenedor.Controls.OfType<Control>())
    {
        if (repos)
        {
             Point tmp = item.Location;              
             item.Location = p;
             p = tmp;
        }


        if (item.Name == nombreTextBox)
        {
            panelContenedor.Controls.Remove(item);
            panelContenedor.Controls.Remove(bt);
            repos = true;
            p = item.Location;
        }

    }

您可以将动态控件放在 FlowLayoutPanel 上。直接或组合在 PanelUserControl.

FlowLayoutPanelFlowDirection 属性 设置为 TopDownFlowLayoutPanel 将自动排列您的控件。您还可以将 WrapContents 属性 设置为 False 并将 AutoScroll 设置为 true 以显示滚动条。

或者您可以使用 FlowDirection = LeftToRight,将文本框和按钮直接放在 FlowLayoutPanel 上,让子控件换行 (WrapContents = True).在子控件中,出现一个新的 属性 FlowBreak。它可以设置为 True 让最后一个控件出现在一行中并让下一个控件独立于 FlowLayoutPanel.

的宽度

您还可以使用子控件的 Margin 属性 来控制它们在 FlowLayoutPanel 中的布局,因为 Location 属性 变得无用.

FlowLayoutPanel(以及 Panel)在 "Containers" 部分的工具箱中可用。