Reputation: 137398
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:
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.
Upvotes: 31
Views: 22076
Reputation: 834
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.
Upvotes: -1
Reputation: 4145
Basically the DockStyle.Fill
control should be added first in the Controls
collection.
Upvotes: 6
Reputation: 137398
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:
If you take a close look at the borders in this little example, this actually seems to work better than BringToFront()
.
Upvotes: 39
Reputation: 53595
Use Bring to Front on your Button 3 in the designer, or call this code:
b3.BringToFront();
Upvotes: 5