views:

237

answers:

4

Are there any other methods of bringing a control to the front other than control.BringToFront()? I have series of labels on a user control and when I try to bring one of them to front it is not working. I have even looped through all the controls and sent them all the back except for the one I am interested in and it doesn't change a thing.

Here is the method where a label is added to the user control

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

Here is the method that sends all of them to the back.

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
    }
}
A: 

Controls' z-index is per-container.

If you call BringToFront on a control that is inside a container (such as a Panel), it will not bring the container to the front.
Therefore, the control will only go in front of other controls in that container.

To see what containers your controls are in, you can use the Document Outline pane in the View menu.

EDIT: Your userContainer control is probably behind a different control.

SLaks
A: 

Have you tried Invalidate() after BringToFront()? BringToFront does not raise the Paint event

Patrick
I just tried and that didn't help either. It appears like a couple labels have the same z-index and some don't. From my understanding they should all have the same z-index if I set them manually.
Nathan
This will not help.
SLaks
A: 

I think you just need to change your last line:

userContainer.Controls[field.FieldName].BringToFront(); 

to this:

userContainer.Controls[field.Name].BringToFront(); 

When you use a string as the indexer for the Controls collection, it goes by the Name property of the control (not the FieldName property).

Since you're just trying to bring the most recently-added control to the top, this would also work:

userContainer.Controls[userContainer.Controls.Count - 1].BringToFront();
MusiGenesis
No; otherwise, he would get an exception.
SLaks
@Slaks: based on the usage in the question, it looks like `FieldName` would return the same value no matter which instance, like `FieldTop` and `FieldLeft` etc. So `FieldName` may just happen to be the same name as the first instance, so the call to BringToFront is always applied to the first control.
MusiGenesis
Why not type just `field.BringToFront()`? There's really no need to find it in the control collection when he already has a reference to it.
Patrick
FieldName is property I created for the label(which is a user control as well)
Nathan
field.BringToFront() won't work either.
Nathan
+1  A: 

Yeah, there's another way. The Controls.SetChildIndex() also changes Z-order. The one with index 0 is the one on top. Doesn't buy you anything though, BringToFront() uses this method.

Your SendLabelsToBack() method as given cannot work, it will also send the label to added to the back. But your next statement fixes that again.

Okay, that doesn't work, which means the BringToFront() method doesn't get executed. Look in the Output window for a "first chance exception" notification. As written, your SendLabelsToBack() will cause an exception if the user control contains any control other than a UserLabel. Also, set a breakpoint after the BringToFront() call and check the value of userContainer.Controls[0].Name when it breaks.

Hans Passant
I don't really follow this the last portion because the form is only instantiated one time.
Nathan
Just trying to come up with a reason that the label would not be visible. Is it in fact visible but positioned wrong? Or is it not visible at all?
Hans Passant
It is visible behind another label.
Nathan
@Nathan: post updated.
Hans Passant
After rechecking the name of the label I realized another label had accidentally been given the same name. So its BringToFont was being called instead of the one I wanted. Should have caught this before asking the question...Thanks Hans.
Nathan