C# 在父窗体上启用滚动条

C# 在父窗体上启用滚动条,c#,.net,winforms,scrollbar,C#,.net,Winforms,Scrollbar,我有以下问题。基于图像 子窗体上的某些控件无法正确显示。另外,我不能在子窗体上使用设置为true的自动滚动,因为它的一些控件是锚定在底部的。 我所想的解决方案是,当子窗体的高度重叠时,在父窗体上有一个滚动条。我应该在代码中添加什么使父窗体具有滚动条 我使用此代码在父窗体中显示子窗体 void ParentButtonClickNew(){ ChildForm entry = new ChildForm(); LoadChildForm(entry, this); } publ

我有以下问题。基于图像 子窗体上的某些控件无法正确显示。另外,我不能在子窗体上使用设置为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 { }
            }
        }
    }
void parentButtonClicknowed(){
ChildForm条目=新的ChildForm();
LoadChildForm(条目,本);
}
公共void LoadChildForm(对象子窗体、对象容器)
{
System.Windows.Forms.Form xForm=(System.Windows.Forms.Form)子窗体;
System.Windows.Forms.Control=(System.Windows.Forms.Control)容器;
xForm.TopLevel=false;
if(control.Controls.Count==0)
{
xForm.Parent=控件;
xForm.StartPosition=FormStartPosition.CenterScreen;
//xForm.WindowState=System.Windows.Forms.FormWindowState.Maximized;
xForm.Show();
xForm.BringToFront();
}
其他的
{
bool isFound=false;

对于(int i=0;i所以您将子窗体放在父窗体上,其中子窗体比父窗体大。我要告诉您的第一件事是,您不应该创建比父窗体大的子窗体。它总是很复杂。其次,我建议使用比滚动条更简单的方法。您可以在子窗体上注册到eve按下鼠标和向上鼠标并执行以下操作:

  private Point p;

  private void Form1_MouseDown(object sender, MouseEventArgs e)
  {
     p = new Point(e.X, e.Y);
  }

  private void Form1_MouseUp(object sender, MouseEventArgs e)
  {
     int distance = e.Y - p.Y;

     // so the window won't move with every click
     if (distance > 10)
     {
        Location = new Point(Location.X, Location.Y + distance);
     }
  }

它比滚动条更简单,用户也更方便

为什么不尝试将所有子窗体控件放在面板中,并将滚动条放在面板中呢?我认为这要容易得多

这段代码中有一些非常严重的错误,正在出现nullref和cast异常。你真的需要停止用try/cat隐藏这些错误这是你问这个问题的核心原因,你只是不知道代码里面发生了什么

出现问题的最大原因是您设计方法的方式。您必须始终创建表单的实例并将其作为第一个参数传递。问题是,如果表单已经存在,那么您就永远不会实际使用该实例。因此,尝试在该实例上设置AutoScroll=true这样的属性没有任何好处效果

您需要一些根本不同的东西。例如
类型
参数。可能如下所示:

    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); 
}
请注意,当您正确设计代码时,代码会变得多么清晰易懂。您可以这样称呼它:

    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客户端窗口等效的窗口,则必须创建一个额外的容器窗口,一个面板即可。with AutoScroll=true


结果是永远不会像MDI一样,不会很有用。考虑一个停靠窗口布局代替MDI。在魏奋洛中做得很好。

> <代码>控件。AutoSoCull=true;< /C> >,您必须将父窗体的<代码> AutoSoCurLy/<代码>设置为NoPE。控件没有您所拥有的属性。要将您的
容器
转换为
容器控件
表单
控件
没有
自动滚动
。我尝试过,但仍然不起作用。嘿@KingKing,我再次测试了它。只有当父窗体的控件未设置为锚定底部且父窗体为m更高。我希望它能像mdiform一样工作,但只能像垂直滚动条一样。谢谢韩先生。谢谢你提供的信息并纠正我的错误。我尝试了以下解决方案,效果要好得多。我如何为表单添加最大化状态?我已将xForm.WindowState设置为最大化,但我在ui上遇到了问题。这就是我想要的警告,它不再是表单了。你需要隐藏损坏的标题栏,将FormBorderStyle属性设置为None。你不想这样做,但你应该这样做。有没有办法不将FormBorderStyle设置为None?韩先生。我只是想问一下。我不知道该怎么做。如果我喜欢此代码
Childform entry=n,如何传递值ew Childform();entry.TransactionId=1;LoadChildForm(entry,this)如果你不想采纳我的建议,使用像DokPoad套件这样的现有库,那么就强烈地考虑只使用内置在WiFrm中的普通MDI支持。你可以在以后使它更好,让它在架子上,直到你获得更多的经验。