管理 ControlCollection - 在底部显示一个新元素

Manage a ControlCollection - display a new element at the bottom

我需要在现有视图的底部添加一个简单的。它由我知道不正确的代码中的嵌套面板组成。但考虑到我的可用时间,我想要的是(听起来很简单)将我的 link 添加到现有内容下方。

简而言之,正在显示一个 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);

但是 link 总是出现在其他元素的后面,而不是在它们下面。

因此问题是非常基本的:如何添加一个简单的 LinkLabel 出现在包含 Panels 和 TableLayoutPanels 等元素的视图底部?

第一个问题是控件没有位置设置,这为随机和不需要的东西留出了空间。

对于 ControlCollection 元素要记住两点:

  • 找到他们
  • 订购它们

需要知道的是,ControlCollection 的控件是根据它们的索引排序的,并且索引较大的一个将是容器边界最多的那个(无论 children 元素锚点的定义顺序如何)()

一个解决方案是

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-以相反的顺序排列 child 如果我们需要在我的例子中,我们希望将它们显示在相反顺序)

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);