将Winforms控件带到前面

Nat*_*han 15 c# controls winforms

除了control.BringToFront()之外还有其他方法可以将控件带到前面吗?我在用户控件上有一系列标签,当我尝试将其中一个标签放在前面时,它无法正常工作.我甚至已经完成所有控件的循环并将它们全部发送回去,除了我感兴趣的那个并且它没有改变一件事.

以下是将标签添加到用户控件的方法

private void AddUserLabel()
{
    UserLabel field = new UserLabel();
    ++fieldNumber;

    field.Name = "field" + fieldNumber.ToString();         

    field.Top = field.FieldTop + fieldNumber;
    field.Left = field.FieldLeft + fieldNumber;
    field.Height = field.FieldHeight;
    field.Width = field.FieldWidth;
    field.RotationAngle = field.FieldRotation;
    field.Barcode = field.BarCoded;
    field.HumanReadable = field.HumanReadable;
    field.Text = field.FieldText;
    field.ForeColor = Color.Black;

    field.MouseDown += new MouseEventHandler(label_MouseDown);
    field.MouseUp += new MouseEventHandler(label_MouseUp);
    field.MouseMove += new MouseEventHandler(label_MouseMove);

    userContainer.Controls.Add(field);

    SendLabelsToBack(); //Send All labels to back

    userContainer.Controls[field.FieldName].BringToFront();
}
Run Code Online (Sandbox Code Playgroud)

这是将所有这些发送到后面的方法.

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
    }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 20

是的,还有另一种方式.这Controls.SetChildIndex()也改变了Z阶.索引为0的那个是顶部的那个.虽然不买你什么,但BringToFront()使用这种方法.

SendLabelsToBack()给出的方法不起作用,它也会将标签发送到后面.但是你的下一个声明再次修复了这一点.

好的,这不起作用,这意味着该BringToFront()方法不会被执行.在"输出"窗口中查找"第一次机会异常"通知.如上所述,SendLabelsToBack()如果用户控件包含除UserLabel之外的任何控件,则会导致异常.此外,在调用设置断点BringToFront()并检查userContainer.Controls[0].Name它何时中断的值.


SLa*_*aks 6

控件的z-index是每个容器.

如果在容器(例如a Panel)内的控件上调用BringToFront ,则不会将容器放在前面.
因此,控件只会在该容器中的其他控件前面.

若要查看控件所在的容器,可以使用"视图"菜单中的"文档大纲"窗格.

编辑:您的userContainer控制可能背后是一个不同的控件.


Pat*_*ick 5

您是否尝试过Invalidate()之后BringToFront()?BringToFront不会引发Paint事件

试试这个:

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
        lbl.Invalidate();
    }
}
Run Code Online (Sandbox Code Playgroud)