I have two panels: panelA, panelB in a panel: panelContainer.
How do I make panelA and panelB go side by side taking 50% width each of the panelContainer?
Use TableLayoutPanel with one row(100%) and two columns (50% each).
You can use SplitContainer instead of panel. Set IsSplitterFixed to true, in design mode set SplitterDistance to be half of SplitContainer's width and set the SplitterWidth to 1. Make sure that FixedPanel is set to none. Then at runtime it will maintain the ratio of panels widths.
The only problem is that you can't set SplitterWidth to zero so there will always be a slight distance between panels. If that's not a problem and if you don't need the panelContainer to actually be a panel for some reason, that's the way I would do it.
Check SplitterDistance Property. Override form resize and set this value = form.width / 2;
See more.
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.splitcontainer.splitterdistance?view=netframework-4.8
Related
How do i dock a child control at a bottom right position when compared to the parent control?
I can see that the dockstyle enum has values for
None,Top,Bottom,Right,Left and Fill ...
How can i set for Bottom right ???
perhaps you don't want to dock it bottom-right. Docking changes the position of the control, but also the size to fit in th height or width of the form.
If you want to keep it down and on the right, anchor it.Remove left and top anchors and add bottom and right anchors. Your control will keep there!
** EDIT **
According to OP comment, it must be on the bottom and take all width and have fixed height. then you must take this steps:
To keep it tidy, you need at least 2 controls:
The one that it's on the bottom: dock it to the bottom and set its height.
Other one that use docking style of Fill. This makes it take all the space not occupied by the bottom control.
If you have problems setting it up, use the Layout Window (I hope that's the name in English. My VS is localized) to move them around until it works. Sometimes docking it's a bit nasty and the only way to make it work the way you like is changing the order nad nesting of controls using this layout window.
Use AnchorStyles:
yourComponent.Anchor = ((System.Windows.Forms.AnchorStyles)
((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
To "dock" in the bottom right, you need to
Dock ControlA on the Right side of the parent, ControlB
Set the Top Padding of ControlA to ControlA.Padding = new Padding(0, ControlB.Height - nTopPadding, 0, 0);
nTopPadding can be whatever you need it to be. For TextBoxes, Labels, and the like, ControlA.Font.Height works the best.
This also works when AutoSize = true. You'll only need to update the padding as needed.
From MSDN documentation for Control.Dock:
A control can be docked to one edge of its parent container or can be
docked to all edges and fill the parent container.
So you cannot dock to two edges - I'm actually not sure what you mean by this.
If you want to keep a control in the bottom right of the screen you might be thinking of the Anchor property, which does let you set multiple edges to anchor the control to.
try setting the Dock to Bottom, Depending on your control you may have to turn autosize off, a label for instance
I have a SplitContainer in my form.
On the 1st panel I have a TreeView and a ListView on the 2nd. (Classic)
Now I want to limit the size of the 1st panel (with the TreeView) to 250 pixels wide.
I wish to block the separator from moving too much (or too less).
How do I do that?
You can use SplitContainer.Panel1MinSize property.
SplitContainer1.Panel1MinSize = 250;
First, if you want to constrain the TreeView to be EXACTLY 250px, set the FixedPanel to be Panel1, set the IsSplitterFixed property to True, and set the Panel1MinSize to 250. This basically makes the split graphical only; the splitter will default to a size large enough for the TreeView, and will not move.
If you want to constrain the TreeView to be AT LEAST 250px, simply set Panel1MinSize to be 250. This will prevent the user from making the panel SMALLER than that, though they can make it LARGER. There is no maximum constraint, but you can get the effect of one by setting a maximum size for the window and a minimum size for the other panel of the SplitContainer.
Just a little addition.
Here is the code to place in the frmMain_Load() (or whereever). In the code, the minimum is 250 pixels and the maximum is 400 pixels.
this.splitContainer1.Panel1MinSize = 250;
this.splitContainer1.Panel2MinSize = this.splitContainer1.Width - 400;
Do not forget to place the same code in the resize event frmMain_Resize()
I guess you should take look at the FixedPanelProperty of the splitContainer. I allows you to only let the other panel grow and shrink on rezise operations:
The resizing is much smoother.
I can't seem to figure out how to keep a panel's width fixed in a Split Container in a WinForm.
Any suggestions?
property SplitterPanel.FixedPanel - set one of the panels to fixed size
property SplitterPanel.IsSplitterFixed - set to true
In order to make panel1 fixed
In the properties of the SplitContainer, set the FixedPanel property to Panel1.
Then, set the SplitDistance and Panel1MinSize to the same value.
Fix Panel (Lock Panel):
SplitContainer.FixedPanel = FixedPanel.Panel
If you'd keep one panel's size fixed, there is no logical way to move the splitter. Since you can't move the splitter, it just doesn't make sense to use a SplitContainer anymore. Use two Panel controls.
It depends what you want.
FixedPanel let's the user resize the panel but it won't resize automatically when the control is resized.
IsSplitterFixed will disable the splitter, but it will still resize automatically when the control is resized.
If you use both then it will be totaly fixed. But then you're better off using two panels like Hans said.
// from Microsoft documentation similar to Dmitri answer:::::::::::
// if make panel1 fixed:
mySplitContainer.FixPanel = System.Windows.Forms.FixedPanel.Panel1;
// if make panel2 fixed (in this case can't use fixed splitter distance):
mySplitContainer.FixPanel = System.Windows.Forms.FixedPanel.Panel2;
// and to be safe set the appropriate panel min size for the splitcontainer too;
I'm developing an app for Windows Mobile 5.0 and above, with C# and .NET Compact Framework 2.0 SP2.
I have a WinForm with two panels inside (upperPanel and bottomPanel). I want that upperPanel always fill 2/3 of form's height, and bottomPanel fills 1/3 of form's height. Both panels will fill completly form's width.
I've used this:
upperPanel.Dock = Fill;
bottomPanel.Dock = Bottom;
But upperPanel fills the form completly.
How can I do this? I want, more o less, the same gui on differents form factors and on landscape or protrait mode.
Thank you.
What you need to do is to put the bottom panel on first and set its Dock property to Bottom. Then set the panel's height to be 1/3 of the form's height. Finally, add a second panel and set its Dock property to Fill. The key here is that you want to add the control that will fill the remaining area to be added last. Alternatively, you can play around with the Bring to Front and Send to Back commands in Visual Studio to get the designer to cooperate.
You may also need to hook the OnSizeChanged event for the form and re-set the height of the bottom panel to account for layout changes. It's been a little while since I did compact framework programming, so I'm not sure.
Right click on the upperPanel and select Bring To Front. However, I don't think this will give you the result you want. When you resize, the bottom panel will remain the same height, while the upper panel will stretch to fill the form.
Using your docking settings, with this code might do the trick:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
this.bottomPanel.Height = Convert.ToInt32((double)this.Height / 3.0);
}
Set both panels to "not anchored". That is: Remove Dock-Value and clear the Anchor property. Then, move the controls so they are sized the way you'd like them to be sized.
After that, upon resizing the form, they should resize relatively.
EDIT
Oops, just tried it and sure it doesn't work. I mixed this up with a solution that automatically keeps controls centered within the window...
Well, I'd guess you then have to create a handler for the form's Resize event and manually align the controls after the form has been resized.
Go to Tools, Other Windows, Document Outline. Find the two panels, and swap the order of them. The control that has DockStyle.Fill has to come first for it to be docked correctly. (or last.. never sure which one it is, but it is one of them :p)
This won't solve the always 1/3 and 2/3 issue though... cause the bottom panel will have a fixed height (unless I am mistaken). I think maybe the TableLayoutPanel supports this though...
Update: As noted in the comments, that panel doesn't exist in the compact framework. So, I suppose the easiest solution to this problem would then try to use the docking, but update the height of the bottom panel whenever the size of the form changes.
If you want this to work perfectly you'll need to add some code to the Resize event of the Form which then specifically works out the relative sizes and places the controls in the correct place after a resize.
If you're not worried about losing precision and the forms aren't going to move much you can avoid this by using some relatively smart anchoring. Essentially you're going to have to select a "grower" (the part of the form that gets bigger, the bigger the form gets). In this scenario I would probably anchor the top part to Top | Left | Right and the bottom part to Top | Left | Right | Bottom. This would mean that the lower part of the form will get bigger if the form is expanded. In most cases this is acceptable. If it isn't use the Resize event and some code.
The easiest way to do this is to nest panels. Just set up panels for top bottom and fill. Then use panels within those panels to do the same. The only issues I've had therein are datagrid resizing, which is always a pain anyway. in that case, you have to use some code to resize the datagrid control on the form resize event.
I would like to add a point to #jasonh answer.
For the panel that occupies 2/3 of the form, you will have to set the AutoScroll property of the panel to true.
This will enable the panel to display scroll when the control size exceed the visibility to the user and also ensure the visibility of the smaller panel which is 1/3 of the forms height.
You can get the required design by using nested panels along with few setting with Anchoring and Docking Properties.Follow the following steps:
1) Add the Form and put a Panel1 on it. Set its Dock Property as 'Fill' and ResizeMode as 'Grow&Shrink'.
2) Add Second panel2 and set its Dock Property to 'Bottom', Set the Height and set the Anchor property to 'Top,Left'.
3)Add Third panel and set its Dock Property to 'None', Set the Height and set the Anchor property to 'Top,Bottom,Left,Right'.
Save and Compile. Now all the panels Would maintain their relative Positioning With resizing.
i have 3 custom controls, that i want to place in a resizable window next to each other. when the window is being resized, these controls should also resize, each taking 33% of the available width.
i tried to use a table layout, but it seems the table only grows, but never shrinks.
thanks for any help on this!
You can use a TableLayoutPanel, with 3 columns each of size "33% percent". Then you put each of your control in the panel, and set the anchor property as you wish (for example right-left if your control should resize themselves only on the horizontal plane).
Your TableLayoutPanel should also have its property Dock set to True so that he can occupy all your window and resize accordingly.