Управление 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);
Другие вопросы по тегам