开发者

WinForms anchored controls don't maximize correctly

I have an issue with WinForms (VB.NET).

The main window is an MDI container. The user opens a new child window:

WinForms anchored controls don't maximize correctly

and then maximizes it, so the window correctly fills up the client area. My controls are properly anchored (with the IDE property Anchor) to the window sides so that enlarging the window always fills nicely the client area:

WinForms anchored controls don't maximize correctly

In this state (client windows maximized) the user opens a different or a new child window, but the new window controls are not stretched, that is they don't "understand" they should stretch!

WinForms anchored controls don't maximize correctly

This is particularly annoying because if the user tries to restore the window, then the controls are stretched in, so they disappear (see there's no more the listview)!

WinForms anchored controls don't maximize correctly

Is this a bug? How can I solve this?

edit: as per Hans Passant's comment, I created a new simple project and it worked as it should. So I investigated to see what was different from my real project and the sample. The difference is that in my project I create forms dynamically.

I dynamically create many buttons on a toolbar. When the user clicks a button, this is the code that gets executed:

Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Cursor.Current = Cursors.WaitCursor

        Dim b As Button = CType(sender, Button)

        Dim assem As Assembly = Assembly.GetExecutingAssembly()
        Dim formType As Type = assem.GetType(CStr(b.Tag))

        Dim exFormAsObj As Object = Nothing
        Try
            exFormAsObj = Activator.CreateInstance(formType)
        Catch ex As Exception
            Cursor.Current = Cursors.Default
            MessageBox.Show("clicca meglio:" + ex.ToString)
            Exit Sub
        End Try

        Dim 开发者_如何学运维f As Form = CType(exFormAsObj, Form)
        f.MdiParent = Me
        f.Show()

        Cursor.Current = Cursors.Default
    End Sub

That is, the form name is in the button tag. I create a new instance of the form, with Activator.CreateInstance(formType) then I show it: f.Show().

I am pretty sure that the problem is in this dynamic child form creation, but I can't get where.

edit2: Found! In my form common Load event I was doing

myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)

instead of False I should have written true: myform.ResumeLayout(True)

So simple, I'm sorry.


I've found the solution, (thanks Cody Gray to suggesting to post my own answer here).

In my form common Load event I was doing:

myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)

instead of False I should have written true: myform.ResumeLayout(True)

Simple, but tricky. Thanks all.


I think what you might want to achieve is done using

this.LayoutMdi(MdiLayout.TileHorizontal);

or one of its relatives.

Keep in mind that MDI layouts are in general discouraged.


My controls are properly anchored (with the IDE property Anchor)

Perhaps try instancing the form and set the properties programmatically in the load event.

If one instance works, but other instances do not, that means you need to inspect the properties of the instanced forms with the debugger to see if they are indeed set the way you expect.


I was using a datagridview on an mdi child form with all four sides anchored and it would size properly as long as the form was created not maximized. If I created the form while other children were maximized, it sized incorrectly and never corrected itself even if you normalized and resized the form manually. My solution was to put a panel on the form with all four sides anchored and placing the DGV in the panel with dock set to file. I have no idea why I had to do this, but it DID fix the problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜