加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在父窗体上启用滚动条

发布时间:2020-12-15 07:57:02 所属栏目:百科 来源:网络整理
导读:我有以下问题.基于图像 子表单上的某些控件无法正确显示.我也不能在子窗体上使用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做得很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读