我有以下问题.基于图像
子表单上的某些控件无法正确显示.我也不能在子窗体上使用Autoscroll设置为true,因为它的一些控件是锚定在底部.
我想的修复是当子表单的高度重叠时在父表单上有一个滚动条.我应该在我的代码上添加什么来使父表单有一个滚动条?
子表单上的某些控件无法正确显示.我也不能在子窗体上使用Autoscroll设置为true,因为它的一些控件是锚定在底部.
我想的修复是当子表单的高度重叠时在父表单上有一个滚动条.我应该在我的代码上添加什么来使父表单有一个滚动条?
void ParentButtonClickNew(){ ChildForm entry = new ChildForm(); LoadChildForm(entry,this); } public void LoadChildForm(object childForm,object container) { System.Windows.Forms.Form xForm = (System.Windows.Forms.Form)childForm; System.Windows.Forms.Control control = (System.Windows.Forms.Control)container; xForm.TopLevel = false; if (control.Controls.Count == 0) { xForm.Parent = control; xForm.StartPosition = FormStartPosition.CenterScreen; //xForm.WindowState = System.Windows.Forms.FormWindowState.Maximized; xForm.Show(); xForm.BringToFront(); } else { bool isFound = false; for (int i = 0; i <= control.Controls.Count - 1; i++) { try { System.Windows.Forms.Form myForm = (System.Windows.Forms.Form)control.Controls[i]; if (myForm.Name == xForm.Name) { isFound = true; xForm.StartPosition = FormStartPosition.CenterScreen; myForm.Show(); myForm.BringToFront(); } else { myForm.SendToBack(); } } catch { } } if (!isFound) { try { xForm.Parent = control; System.Windows.Forms.Form myForm = (System.Windows.Forms.Form)control.Controls[xForm.Name]; xForm.StartPosition = FormStartPosition.CenterScreen; myForm.Show(); myForm.BringToFront(); } catch { } } } }
解决方法
这段代码中存在一些非常严重的错误,它正在下雨nullref并强制转换异常.你真的需要用try / catch来停止隐藏这些bug.这是你提出这个问题的核心原因,你只是无法弄清楚代码里面发生了什么.
您遇到问题的最大原因是您设计方法的方式.您必须始终创建表单的实例并将其作为第一个参数传递.麻烦的是,如果表单已经存在,那么你永远不会真正使用该实例.因此尝试在该实例上设置AutoScroll = true等属性只是没有任何效果.
你需要一些根本不同的东西.像Type参数一样.这看起来像这样:
public void LoadChildForm(Type childForm,Control container) { foreach (Control child in container.Controls) { if (child.GetType() == childForm) { // Found it,bring to front child.BringToFront(); return; } } // Doesn't exist yet,create a new instance Form xForm = (Form)Activator.CreateInstance(childForm); xForm.TopLevel = false; xForm.Visible = true; container.Controls.Add(xForm); xForm.BringToFront(); // Show scrollbar xForm.AutoScrollMinSize = new Size(0,2000); } }
请注意,在您正确设计代码时,代码会变得更清晰和易懂.你这样称呼它:
void ParentButtonClickNew(){ LoadChildForm(typeof(ChildForm),this); }
要注意真正的问题,这永远不会是MDI的模拟.它看起来像一个MDI子形式,但事实并非如此.您无法激活窗口,标题栏将始终具有“未激活”颜色.如果您真的想要使用滚动条等效MDI客户端窗口,那么您必须创建一个额外的容器窗口,Panel将会这样做.使用AutoScroll = true.
然而,结果永远不会像MDI那样,并且不会非常有用.考虑使用对接窗口布局作为MDI的替代方案.在Weifenluo的DockPanel Suite做得很好.