我是使用C#的新手,我在这里提出问题是因为我没有找到在Google中搜索解决方案以及关于SO的其他问题,我将解释我的示例应用程序的作用:
当我运行它时,默认情况下会显示一个带有文本框的表单,该文本框将始终显示,在键入一些文本并按Enter后,它将生成一个新的文本框和一个新的按钮(所有控件,包括默认文本框都是在面板内),并且新的文本框具有与默认文本框相同的功能,当我单击其文本框旁边生成的按钮时,它将删除按钮本身和文本框,但是在此之后,如果我删除一些随机文本框,则会留下一个空格在这些控件之间,如何重新组织这些内容,以免在它们之间留出空间?
如您在图像中所见,您能告诉我如何解决此问题或给我建议以实现此目标吗?谢谢,顺便说一下,这是我用来生成按钮和文本框的方法
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);
}
}
}
答案 0 :(得分:3)
您可以将动态控件放在server_windows_amd64.exe --www ../../FEF-UdaciMeals-Backbone
上。直接或分组为FlowLayoutPanel
或Panel
。
将UserControl
的{{1}}属性设置为FlowDirection
。 FlowLayoutPanel
随后将自动排列您的控件。您还可以将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;
}
}