0

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

简而言之,显示了一个 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)的视图底部?

4

1 回答 1

0

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

对于 ControlCollection 元素需要记住两件事:

  • 找到它们
  • 订购它们

要知道的是,ControlCollection 的控件是根据它们的索引排序的,并且较大的索引之一将是容器边界处最多的一个(无论定义子元素锚的顺序如何) (https://stackoverflow.com/a/7685041/6617804

一个解决方案是

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);
于 2018-04-11T13:31:44.117 回答