请问C#用panel切换窗体是怎样的,急急急,先谢谢各位大侠啦 3C

我设置了一个菜单和两个panel 1 和2,想分别显示窗体Form2和Form3,代码如下,但是结果没法进行切换,请问应当怎样写代码?新手,谢谢

private void 时间换算ToolStripMenuItem_Click(object sender, EventArgs e)
{
panel1.Controls.Clear();//移除所有控件
Form2 frm2 = new Form2();
frm2.TopLevel = false;
frm2.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
frm2.Dock = DockStyle.Fill;

frm2.Show();

    }

    private void 卫星位置计算ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        panel2.Controls.Clear();//移除所有控件
        Form3 frm3 = new Form3();
        frm3.TopLevel = false;
        frm3.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        frm3.Dock = DockStyle.Fill;
        this.panel2.Controls.Add(frm3);
        frm3.Show();

    }

12个回答

常见的思路,用一个panel,两个form,但是两个form是在外面定义的。例如:
public class MainForm : Form
{
Form2 frm2;
Form3 frm3;
public MainForm()
{
frm2=new Form2();

...

            frm3=new Form3();   
            ...
            this.panel1.Controls.Add(frm2);
            this.panel1.Controls.Add(frm3);
            frm2.Show();
            frm3.Show();

            frm2.Visible=true;
            frm3.Visible=false;
    }
    private void Click1(object sender, EventArgs e)
    {
            frm2.Visible=false;
            frm3.Visible=true;
    }
    private void Click2(object sender, EventArgs e)
    {
            frm2.Visible=true;
            frm3.Visible=false;
    }

}
上面是伪代码,大概的思路是这样。有兴趣自己摸索一下。

private void 时间换算ToolStripMenuItem_Click(object sender, EventArgs e)
{
panel1.Controls.Clear();//移除所有控件
Form2 frm2 = new Form2();
frm2.TopLevel = false;
frm2.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
frm2.Dock = DockStyle.Fill;
panel1.Controls.Add(frm2);
frm2.Show();
}

参考:
http://blog.sina.com.cn/s/blog_711648580100nsa5.html
http://www.cnblogs.com/csMapx/archive/2011/06/11/2078126.html
你的代码没看出什么问题
不知道你说的切换是什么意思,我的理解是让Panel2和Panel3切换,连带里面的Form就切换了
直接设置Panel的Visible就可以了

yedasha
yedasha private void 时间换算ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.TopLevel = false; frm2.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; frm2.Dock = DockStyle.Fill; panel1.Visible = true; }
5 年多之前 回复
yedasha
yedasha 我改了改还是不行,是不是我写错了啊?
5 年多之前 回复

一般不都是通过IsMdiContainer 和设置form.MdiParent 来设置主子窗体的么?

设置visible,或者bringtofront,感觉tablepage更好用

你现在程序运行的效果是什么,哪里不对

Panel1和Panel2是并列显示在窗体上还是如何,你想做成什么样。

weixin_30879531
weixin_30879531 回复爱之红豆秋海棠: 能麻烦给个微信之类的吗 谢谢
接近 5 年之前 回复
weixin_30879531
weixin_30879531 回复爱之红豆秋海棠: 是的 求解答!感谢
接近 5 年之前 回复
weixin_30879531
weixin_30879531 回复爱之红豆秋海棠: 是的 求解答。。
接近 5 年之前 回复
yedasha
yedasha 不是并列,form2和3 不能同时显示
5 年多之前 回复

那你只要设置panel1.Visible = true;panel2.Visible = false;
另一个panel2.Visible = true;panel1.Visible = false;

时间换算里面少了一句 this.panel1.Controls.Add(frm2);

icyjiang001
icyj 常见的思路,用一个panel,两个form,但是两个form是在外面定义的。例如:
5 年多之前 回复
icyjiang001
icyj 常见的思路,用一个panel,两个form,但是两个form是在外面定义的。例如
5 年多之前 回复

我是采用动态加载:
public TabPage Show_Form(string FormTitle, string FormName)
{

        if (FormName != "")
        {

            ObjectHandle obj = Activator.CreateInstance(null, FormName);
            //obj.Unwrap返回被包装的对象
            if (obj != null)
            {
                Form frm = (Form)obj.Unwrap();
                return initFrom(frm, FormTitle);
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }

        //switch (FormTitle)
        //{

        //    case "录入制程COB绑测":
        //        ERPSystem.QA.录入制程COB绑测 frm2=new QA.录入制程COB绑测();
        //        return initFrom(frm2, FormTitle);

        //    default:
        //        return null;

        //}

    }
    /// <summary>
    /// 表单动态加载到页签
    /// </summary>
    /// <param name="frm"></param>
    /// <param name="Name"></param>
    /// <returns></returns>
    private TabPage initFrom(Form frm, String Name)
    {
        if (!string.IsNullOrEmpty(Name))
        {
            frm.Text = Name;
            frm.TopLevel = false;
            TabPage tp = new TabPage(Name);

            frm.FormBorderStyle = FormBorderStyle.None;
            tp.Controls.Add(frm);
            frm.Dock = DockStyle.Fill;
            frm.Show();

            return tp;
        }
        else
        {
            return null;
        }

    }
共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问