25
votes

I'm trying to dock N number of controls in a container. I want them all to fill the entire width, but stack. I want one particular control (currently the last one) to fill the remaining space, while all others have fixed sizes.

This:

Button b1 = new Button() { Text = "Button 1", Dock = DockStyle.Top };
Button b2 = new Button() { Text = "Button 2", Dock = DockStyle.Top };
Button b3 = new Button() { Text = "Button 3", Dock = DockStyle.Fill };

Controls.Add(b1);
Controls.Add(b2);
Controls.Add(b3);

Produces this:

Button 3 filling entire parent

As you can see, Button 3 is doing exactly what I told it to: Fill the parent. But that's not what I want it to do. Aside from manually placing, and handling resize events, etc. how can I make Button 3 fill the remaining space?

Note: I am not using the designer.

4
See [here][1]. This is a duplicate. [1]: stackoverflow.com/questions/154543/… - Jeff Cuscutis

4 Answers

32
votes

While adding b3.BringToFront() (after it has been added to Controls) works, the simplest solution here, is to simply change the order in which the buttons are added to Controls. The following code works perfectly:

Button b1 = new Button() { Text = "Button 1", Dock = DockStyle.Top };
Button b2 = new Button() { Text = "Button 2", Dock = DockStyle.Top };
Button b3 = new Button() { Text = "Button 3", Dock = DockStyle.Fill };

Controls.Add(b3);    // this guy first!
Controls.Add(b1);
Controls.Add(b2);

The result:

enter image description here

If you take a close look at the borders in this little example, this actually seems to work better than BringToFront().

6
votes

Basically the DockStyle.Fill control should be added first in the Controls collection.

5
votes

Use Bring to Front on your Button 3 in the designer, or call this code:

b3.BringToFront();
-1
votes

button 1 and 2 should have dock property set to top and to make button 3 take the rest of the space you can set its dock property to bottom.

dock = fill will make the button fill the entire space not just the remaining space. Bottom will function just as top did, but anchoring it to the bottom of the parent container. Apply buttons in order of 1, 2, 3.

Furthermore, you could set the dock property to top on all three and simply size button three differently.