Управление ControlCollection - отображать новый элемент внизу
Мне нужно добавить простой внизу существующего представления. Он состоит из вложенных панелей в коде, который, я знаю, не является правильным. Но что я хочу, учитывая мое доступное время, так это (как это ни странно звучит) добавить мою ссылку ниже того, что существует.
В нескольких словах отображается объект ControlCollection (this.Controls), и я не могу найти элемент (LinkLabel или TableLayoutPanel) ниже других элементов.
Вот минимальный существующий код:
private void SetAppearance()
{
pnlTitle = new Panel();
pnlTitle.x = ...
this.Controls.Add(pnlTitle);
lblTitle = new Label();
lblTitle.x = ...
pnlTitle.Controls.Add(lblTitle);
tlpnlCountryOfOrigin = new TableLayoutPanel();
tlpnlCountryOfOrigin.x = ...
pnlTitle.Controls.Add(tlpnlCountryOfOrigin);
CountryOfOrigin = new Label();
CountryOfOrigin.x = ...
tlpnlCountryOfOrigin.Controls.Add(CountryOfOrigin, 0, 0);
cbbCountryOrigin = new ComboBoxWithBorders();
cbbCountryOrigin.x = ...
tlpnlCountryOfOrigin.Controls.Add(cbbCountryOrigin, 1, 0);
pnlSupportInfo = new TableLayoutPanel();
pnlSupportInfo.x = ...
this.Controls.Add(pnlSupportInfo);
}
И я просто хочу добавить свой LinkLabel в конце этого, с этим:
lnkSendLogs = new LinkLabel
{
Font = new Font(ArialBold12px, FontStyle.Regular | FontStyle.Underline),
AutoSize = true,
LinkColor = InfomaxConstants.Colors.Red,
Margin = new Padding(0),
Text = LabelManager.GetLabel("TEXTTOGETLABEL")
};
this.Controls.Add(lnkSendLogs);
Или даже с вложенной TableLayoutPanel (что, как я знаю, не очень хорошая практика):
tlpnlSendLogs = new TableLayoutPanel();
tlpnlSendLogs.ColumnCount = 2;
tlpnlSendLogs.ColumnStyles.Clear();
tlpnlSendLogs.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100));
tlpnlSendLogs.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
lnkSendLogs = new LinkLabel
{
Font = new Font(ArialBold12px, FontStyle.Regular | FontStyle.Underline),
AutoSize = true,
LinkColor = InfomaxConstants.Colors.Red,
Margin = new Padding(0),
Text = LabelManager.GetLabel("TEXTTOGETLABEL")
};
lnkSendLogs.Dock = DockStyle.Fill;
tlpnlSendLogs.Controls.Add(lnkSendLogs, 0, 0);
this.Controls.Add(tlpnlSendLogs);
Но ссылка всегда появляется за другими элементами, а не под ними.
Таким образом, вопрос является очень основным: как добавить простой LinkLabel, появляющийся в нижней части представления, содержащий несколько элементов, таких как Panels и TableLayoutPanels?
1 ответ
Первая проблема заключалась в том, что элементы управления не имели настроек местоположения, что освобождает место для случайных и нежелательных вещей.
Две вещи, которые следует иметь в виду для элементов ControlCollection:
- Найдите их
- Заказать их
Нужно знать, что элементы управления элемента ControlCollection упорядочены на основе их индекса, и индекс с большим индексом будет иметь тот, который больше всего на границе контейнера (независимо от порядка, в котором определяется привязка дочерних элементов) ( /questions/25806617/kak-vstavit-verhnie-zakreplennyie-elementyi-upravleniya-pod-verhnie-zakreplennyie-elementyi-upravleniya-na-paneli/25806625#25806625)
Решение
1-Чтобы установить положение всех элементов ControlCollection в верхней части их контейнера
pnlTitle.Dock = DockStyle.Top;
pnlSupportInfo.Dock = DockStyle.Top;
tlpnlSendLogs.Dock = DockStyle.Top;
Или точно такой же:
pnlTitle.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
pnlSupportInfo.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
tlpnlSendLogs.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
2.1-Чтобы расположить ребенка в обратном порядке, если нам нужно (в моем случае, где мы хотим отобразить их в обратном порядке)
this.Controls.SetChildIndex(pnlTitle, 2);
this.Controls.SetChildIndex(pnlSupportInfo, 1);
this.Controls.SetChildIndex(tlpnlSendLogs, 0);
2.2-ИЛИ добавить их непосредственно в том порядке, в котором они должны быть для отображения:
this.Controls.Add(tlpnlSendLogs);
this.Controls.Add(pnlSupportInfo);
this.Controls.Add(pnlTitle);
Вместо:
this.Controls.Add(pnlTitle);
this.Controls.Add(pnlSupportInfo);
this.Controls.Add(tlpnlSendLogs);