По крайней мере, для вашего второго вопроса, просто измените Label lbl
на Control ctrl
.Это может взять произвольный контроль и сосредоточить его на его родителе, предполагая, что это был один.Вы можете проверить это условие.
Обновление:
Я подумал о вашей проблеме немного больше.Во-первых, ваше приложение будет аварийно завершать работу во время цикла foreach
, если на панели есть какие-либо элементы управления, отличные от Label
.Измените его на foreach (Control ctrl in panel1.Controls)
.Здесь также используется мой первоначальный ответ на ваш второй вопрос.
Ваша основная проблема заключается в том, что, учитывая некоторое количество элементов управления, они должны быть горизонтально отцентрированы на своих родительских элементах и равномерно разнесены.Общая ширина этого: (control1.Width + offset) + (control2.Width + offset) ... (controlN.Width + offset) - offset
.Координата x (startX) этого, если (Parent.Width / 2) - (TotalWidth / 2)
.Теперь, когда вы знаете координату x, вы можете начать раскладывать элементы управления следующим образом:
control1.Left = startX;
control2.Left = control1.Right + offset
controlN.Left = control(N-1).Right + offset
Поскольку реальный код может выглядеть так:
const int Offset = 8; // for example
int totalWidth = panel1.Controls.Cast<Control>().Aggregate(0, (value, ctrl) => value + ctrl.Width + Offset);
for (int index = 0; index < panel1.Controls.Count; index++)
{
Control current = panel1.Controls[index];
if (index == 0)
{
current.Left = startX;
}
else
{
current.Left = panel1.Controls[index-1].Right + Offset;
}
}
Я, по общему признанию, не проверял это, но, может быть, вы получите это работает отсюда.Удачи.