我遇到了WinForms(VB.NET)的问题。
主窗口是MDI容器。 用户打开一个新的子窗口:
然后最大化它,因此窗口正确填充客户区。我的控件已正确锚定(使用IDE属性Anchor)到窗口两侧,这样放大窗口总能很好地填充客户区:
在这种状态下(客户端窗口最大化),用户打开一个不同的或新的子窗口,但新窗口控件没有拉伸,即他们不“理解”他们应该拉伸!
这特别令人烦恼,因为如果用户试图恢复窗口,那么控件就会被拉伸,所以它们就会消失(看不到列表视图了)!
这是一个错误吗?我怎么解决这个问题?
编辑:根据Hans Passant的评论,我创建了一个新的简单项目,它可以正常工作。所以我调查了一下与我的真实项目和样本有什么不同。不同的是,在我的项目中,我动态创建表单。
我在工具栏上动态创建了许多按钮。当用户单击按钮时,这是执行的代码:
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
也就是说,表单名称位于按钮标记中。我使用Activator.CreateInstance(formType)
创建了表单的新实例,然后显示它:f.Show()
。
我很确定问题出现在这个动态的子表单创建中,但我无法得到它。
EDIT2: 找到了!在我的形式常见的Load事件我正在做
myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)
而不是False我应该写成:myform.ResumeLayout(True)
这么简单,对不起。
答案 0 :(得分:3)
我找到了解决方案,(感谢Cody Gray建议在这里发表我自己的答案)。
在我的形式常见的Load事件中我正在做:
myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)
而不是False
我应该写true
:myform.ResumeLayout(True)
简单,但很棘手。 谢谢大家。
答案 1 :(得分:1)
我认为您可能想要实现的目标是使用
完成的this.LayoutMdi(MdiLayout.TileHorizontal);
或其亲属之一。
请记住,一般不鼓励使用MDI布局。
答案 2 :(得分:0)
我的控件已正确锚定(使用IDE属性Anchor)
也许尝试实例化表单并在load事件中以编程方式设置属性。
如果一个实例有效,但其他实例没有,则意味着您需要使用调试器检查实例化表单的属性,以确定它们是否确实按您期望的方式设置。
答案 3 :(得分:0)
我在mdi子窗体上使用了datagridview,并且所有四个边都已锚定,只要窗体创建未最大化,它就会正确调整大小。如果我在其他子项最大化时创建了表单,则它的大小不正确,即使您手动规范化并调整表单大小,也不会自行更正。我的解决方案是在窗体上放置一个面板,四边都固定好,然后将DGV放在面板中,并将底座设置为文件。我不知道为什么我必须这样做,但它解决了这个问题。