Search code examples
c#winformsz-order

Label not visible above ToolStrip


At runtime I add (and remove) several controls, as needed, to a main window which in Designer contains only a ToolStrip with some function buttons. In some cases I want to add an info label next to the toolStrip, but I cannot make it visible, ie. it is hidden below. The code for the label is straightforward

infoLabel = new Label();
infoLabel.AutoSize = true;
infoLabel.Location = new System.Drawing.Point(200, 10);
infoLabel.Size = new System.Drawing.Size(35, 13);
infoLabel.BackColor = System.Drawing.SystemColors.Control;
infoLabel.Font = new System.Drawing.Font("Arial", 13);
infoLabel.ForeColor = System.Drawing.Color.Black;
infoLabel.TabIndex = 1;
infoLabel.Text = "this is info";
infoLabel.BringToFront();
this.Controls.Add(infoLabel);

TabIndex and BringToFront I added as an act of desperation, it does not help. BTW the ToolStrip's TabIndex is 2, and its BackColor I changed to transparent.

However, when I placed a label over the ToolStrip in the Designer, it is visible (ie. on top). I analysed the code then but did not see anything different from what I am writing. What am I missing here?


Solution

  • I suggest calling infoLabel.BringToFront(); at the very end, at least after this.Controls.Add(infoLabel); you current code amended:

    infoLabel = new Label();
    ...
    infoLabel.Text = "this is info";
    
    // First Add to this
    this.Controls.Add(infoLabel);
    
    // Only then we can make infoLabel be the topmost 
    // among all existing controls which are on this
    infoLabel.BringToFront();
    

    We create infoLabel, add it to this and finally make it topmost on this. To make code more readable I suggest something like this:

    // Create a label on this
    infoLabel = new Label() {
      AutoSize  = true,
      Location  = new System.Drawing.Point(200, 10),
      Size      = new System.Drawing.Size(35, 13),
      BackColor = System.Drawing.SystemColors.Control,
      Font      = new System.Drawing.Font("Arial", 13),
      ForeColor = System.Drawing.Color.Black,
      TabIndex  = 1,
      Text      = "this is info",
      Parent    = this // <- instead of this.Controls.Add(infoLabel);
    };
    
    // make infoLabel topmost among all controls on this
    infoLabel.BringToFront();