Вы можете просто добавить высоту TextBox к размеру формы, но было бы лучше использовать константу, которая определяет размер TextBox, а затем добавить это.
Для перемещения listBox / button2 прикрепите их к нижней части формы, и они автоматически останутся на том же расстоянии от нижней части формы.
Что касается динамической генерации, используйте Список (или Стек, в зависимости от того, что именно вы с ним делаете).
partial class Form1 : Form
{
List<TextBox> textBoxes = new List<TextBox>(); // or stack
const int textBoxWidth = 200; // control variables for TextBox placement
const int textBoxHeight = 50;
const int textBoxMargin = 5;
void button1_Click(object sender, EventArgs e)
{
this.Height += textBoxHeight + textBoxMargin;
TextBox tb = new TextBox();
if (textBoxes.Count == 0)
{
tb.Top = textBoxMargin;
}
else
{
tb.Top = ((textBoxHeight + textBoxMargin) * textBoxes.Count) + textBoxMargin;
}
tb.Left = textBoxMargin;
tb.Height = textBoxHeight;
tb.Width = textBoxWidth;
textBoxes.Add(tb);
this.Controls.Add(tb);
}
}
Это должно сработать. Суть метода в том, что все настройки размещения можно выполнить с постоянными значениями.
Лучше ли это делать в WinForms? Ну, конечно, нет никакой реальной причины не делать это в WinForms, эту функциональность достаточно легко реализовать. Я сам парень из WPF, но это все еще законно.
Отредактировано для логических ошибок