Sni*_*pet 7 .net c# scrollbar winforms
我有以下这个问题.基于图像
子表单上的某些控件无法正确显示.我也不能Autoscroll set to true在儿童形式上使用,因为它的一些控制是anchored bottom.我想的修复是当子表单的高度重叠时在父表单上有一个滚动条.我应该在代码上添加什么来使父表单有一个滚动条?
我使用此代码在父窗体中显示子窗体.
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 { }
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码中存在一些非常严重的错误,如雨般的 nullref 和强制转换异常。您确实需要停止使用 try/catch 隐藏这些错误。这是您问这个问题的核心原因,您只是无法弄清楚代码内部发生了什么。
您遇到问题的最大原因是您设计方法的方式。您必须始终创建表单的实例并将其作为第一个参数传递。问题是,如果表单已经存在,那么您永远不会真正使用该实例。因此,尝试在该实例上设置 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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,当您设计正确时,代码会变得更加清晰和易于理解。你可以这样称呼它:
void ParentButtonClickNew(){
LoadChildForm(typeof(ChildForm), this);
}
Run Code Online (Sandbox Code Playgroud)
请注意真正的问题,这永远不会是 MDI 的模拟。它看起来像 MDI 子窗体,但事实并非如此。您无法激活该窗口,标题栏始终具有“未激活”颜色。如果您确实想要具有滚动条的 MDI 客户端窗口的等效项,那么您必须创建一个额外的容器窗口,面板即可。当 AutoScroll = true 时。
然而,结果永远不会类似于 MDI,并且不会非常有用。考虑使用对接窗口布局作为 MDI 的替代方案。Weifenluo 的DockPanel Suite做得很好 。
| 归档时间: |
|
| 查看次数: |
2869 次 |
| 最近记录: |