管理 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);
我需要在现有视图的底部添加一个简单的。它由我知道不正确的代码中的嵌套面板组成。但考虑到我的可用时间,我想要的是(听起来很简单)将我的 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);