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();
}
}
Have you tried
Invalidate()
afterBringToFront()
? BringToFront does not raise the Paint eventtry this:
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, yourSendLabelsToBack()
will cause an exception if the user control contains any control other than a UserLabel. Also, set a breakpoint after theBringToFront()
call and check the value ofuserContainer.Controls[0].Name
when it breaks.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.From my experience looks like windows puts all controls belonging to one graphic container(pane, group box...etc) in a software collection. The collection is ordered by child index which is a property of every control in that container. The trick is that children with the same index can and do exists. In this case windows will paint those children ordered relative to others but between them it will paint them in the reverse order they had been added to the container.
Long story short: for one container-you need to make sure controls have different indexes by changing ALL NOT just SOME of the indexes when you want to change the z-order. For example:
where
indexLogic(newControl )
is your method of calculation of the index of particular control.I think you just need to change your last line:
to this:
When you use a string as the indexer for the Controls collection, it goes by the
Name
property of the control (not theFieldName
property).Since you're just trying to bring the most recently-added control to the top, this would also work: