SplitContainer Panel Resize Issue
Though the question is about 6 years old, I opted to answer this because I was in the same situation as the opening post. Unfortunately, the orientation was not specified. So, my answer would address the ones with Horizontal orientation.
Please translate to C# as this code is in VB.
Private Sub splitContainerMain_Resize(sender As Object, e As EventArgs) Handles splitContainerMain.Resize
'/* This is a work around about panels being left out when SplitContainer is resized */
Dim pnl1Height As Single = splitContainerMain.SplitterDistance '/* Get upper panel height */
Dim pnl2Height As Single = splitContainerMain.Height - splitContainerMain.SplitterDistance '/* Get lower panel height */
splitContainerMain.Panel1.SetBounds(0, 0, splitContainerMain.Width, pnl1Height) '/* Set Upper panel bounds */
'/* Set lower panel bounds, with a top of upper panel height plus splitter width */
splitContainerMain.Panel2.SetBounds(0, pnl1Height + splitContainerMain.SplitterWidth, splitContainerMain.Width, pnl2Height)
End Sub
Comments
-
musefan almost 2 years
The General Problem
The application is C# WinForms .Net 4.0.
I have a
SplitContainer
that takes up most of the form, it is set to Anchor in all directions so it re-sizes along with the form. The left panel (Panel1) has a simple menu, no problems here. The right panel (Panel2) is more complex and contains a number of nested tab controls (with lots of controls) - it is painfully complex, but it's not changing.The problem is that re-sizing the form doesn't work so well. In fact, if you resize by dragging the edges slowly then it works ok, but drag quickly or use the "restore" button (top-right of form) then the issue occurs.
My Control Hierarchy
The following is a simple example of my control hierarchy, its definitely a cut down version but does highlight the nested tab control which may help with replication:
- Form
- Split Container (anchor: top, left, bottom, right)
- SC Panel1 (min width: 300)
- TreeViewControl (forget what it is called)
- SC Panel2
- Panel (anchor: top, left, bottom, right)
- Tab Control (anchor: top, left, bottom, right)
- Tab Control w/ lots of pages that overflow screen and require the navigation buttons to show in top right corner (anchor: top, left, bottom, right)
- Tab Control (anchor: top, left, bottom, right)
- Panel (anchor: top, left, bottom, right)
- SC Panel1 (min width: 300)
- Split Container (anchor: top, left, bottom, right)
Debug Details
After some debugging it appears that it is in fact
Panel2
(a child of the split container) that doesn't resize properly, and the actualSplitContainer
itself resizes fine.Here are the debug values that show this...
Full width form, before resize:
splitContainerMain.Width: 1479 splitContainerMain.Panel2.Width: 1206 panelCenter.Width: 1203 tabControlMain.Width: 1215
All as expected,
splitContainerMain.Panel2.Width
is smaller thansplitContainerMain.Width
.After resize where the issue occurs:
splitContainerMain.Width: 815 splitContainerMain.Panel2.Width: 1206 panelCenter.Width: 1203 tabControlMain.Width: 1215
As can be seen, the
splitContainerMain.Width
has resized as desired, but thesplitContainerMain.Panel2.Width
and subsequently its children have not.NOTE: Please remember, the width updates correctly if I manually resize the form slowly - this is not a problem with me not correctly setting any anchors.
My Efforts So Far
What I have tried to do is use various Form resize events and try to set the widths manually, but to no avail. I think what I would like to try is to set the
Panel2.Width
value from within an event of some sort.
What I Am Looking For
- Is there anyway to force
splitContainerMain.Panel2.Width
to resize correctly when thesplitContainerMain
size changes? - Alternatively, how can I calculate what the
Panel2.Width
should be? And how can I set that value from theForm.Resize
event? (or another event?)
- Form