在C#中将控件及其子控件带到前面

时间:2013-11-05 15:51:36

标签: c# winforms panel

我有一个分层系统,它使用面板来包含不同的控件和GDI图纸,但我想更改它们的显示顺序。我在面板上使用了BringToFront()方法,这确实将它带到了前面,但是我添加到它的控件仍然显示在其他控件的后面。有没有办法让我可以提起这些控制呢?

感谢。

编辑:

我应该补充说这些面板是透明的。我将控件添加到面板中,如panelName.Controls.Add(newControl);

2 个答案:

答案 0 :(得分:0)

您可以对面板的整个子控件集合进行排序,以更改它们的显示顺序。

Panel panel; //your top-most panel; this can be as well a Form

for (int i = 0; i < panel.Controls.Count; i++)
{
    panel.Controls.SetChildIndex(
        panel.Controls[i], panel.Controls.Count - 1 - i
    );
}

为了使这个例子变得简单,集合将按相反顺序排序,但您可以自由添加任何逻辑来计算符合您需求的新子索引。
显然,这里的关键是SetChildIndex方法(documentation),允许您重新排列集合中的控件索引。

如果您只想对类型Panel(或其他单一类型)的对象进行排序,那么使用LINQ可以更快地完成此操作:

List<Panel> sorted = panel.Controls.OfType<Panel>().ToList();
sorted.Sort((p1, p2) => p1.TabIndex.CompareTo(p2.TabIndex));
panel.Controls.Clear();
panel.Controls.AddRange(sorted.ToArray());

这会对比较其标签索引的所有面板进行排序(仅作为示例)。应该很容易将其更改为其他属性。

另一个最常见的“错误”在于您的*.Designer.cs - 文件。将控件放到表单/面板上时,订单可能已颠倒过来。只需查看设计器生成的文件,然后查看订单。

答案 1 :(得分:-1)

您可以遍历面板上的控件列表(包含在Panel.Controls中),并将它们放在前面。

实施例: - 假设你有一个面板p1,带有3个按钮b1,b2和b3。

将p1带到前面以及你要做的所有控件:

p1.BringToFront();
foreach(var c in p1.Controls){ c.BringToFront();}
相关问题