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

时间:2018-08-25 18:33:17

标签: c# button textbox panel

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

当我运行它时,默认情况下会显示一个带有文本框的表单,该文本框将始终显示,在键入一些文本并按Enter后,它将生成一个新的文本框和一个新的按钮(所有控件,包括默认文本框都是在面板内),并且新的文本框具有与默认文本框相同的功能,当我单击其文本框旁边生成的按钮时,它将删除按钮本身和文本框,但是在此之后,如果我删除一些随机文本框,则会留下一个空格在这些控件之间,如何重新组织这些内容,以免在它们之间留出空间?

enter image description here

如您在图像中所见,您能告诉我如何解决此问题或给我建议以实现此目标吗?谢谢,顺便说一下,这是我用来生成按钮和文本框的方法

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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您可以将动态控件放在server_windows_amd64.exe --www ../../FEF-UdaciMeals-Backbone 上。直接或分组为FlowLayoutPanelPanel

UserControl的{​​{1}}属性设置为FlowDirectionFlowLayoutPanel随后将自动排列您的控件。您还可以将TopDown属性设置为FlowLayoutPanel,并将WrapContents设置为true以显示滚动条。

或者,您可以使用False = AutoScroll,将文本框和按钮直接放在FlowDirection上,然后让子控件自动换行(LeftToRight = {{1 }})。在子控件中,将出现一个新属性FlowLayoutPanel。可以将其设置为WrapContents,以使最后一个控件连续出现,并让下一个控件独立于True的宽度进行换行。

FlowBreak属性变得无用时,您也可以使用子控件的True属性来控制其在FlowLayoutPanel中的布局。

Margin(以及FlowLayoutPanel)位于“容器”部分的工具箱中。

答案 1 :(得分:0)

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

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;
        }

    }