C# 如何在子控件(panel)里打开新窗体(form)及信息实时互传

开发中碰到一个问题,一个窗体里需要集成比较多的功能,并且这种是相互独立的。为了降低主窗体的复杂性,就想到在主窗体的控件里直接打开子窗体的方式。这样,相关的控件和逻辑就可以集成在各自的子窗体里,主窗体就可以简单了。

由于子窗体是原来的弹出窗口,因此,想直接打开,但是,发现子窗口无法随主窗口改变大小。查了很多资料也没有找到所以然,后来自己逐个测试才发现窍门,解决了子窗体大小随动的问题,子窗体的几个关键参数:

  1. WindowState=Normal;
  2. ControlBox=False;//不显示窗体操作的按钮
  3. Text="";//不要设置文本,否则,顶部标题条会显示出来。

两个窗体通过相互共享一个label来演示一下消息实时互传的方法,注意将需要外部访问的控件的Modifiers=Public,相当于开放外部访问。

完整的项目如下:

1、form1的设计

2、form1的代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Form2 fm2 = null;
        private void btOpen_Click(object sender, EventArgs e)
        {
            if (fm2 == null)
            {
                fm2 = new Form2(this);
                fm2.TopLevel = false;
                fm2.Dock = DockStyle.Fill;
                fm2.Parent = splitContainer1.Panel2;
                fm2.Show();
            }
            else
            {
                fm2.Show();
            }
        }

        private void btClose_Click(object sender, EventArgs e)
        {
            if (fm2 != null)
            {
                fm2.Hide();
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (fm2 != null)
                fm2.lbFm1.Text = textBox1.Text;
        }
    }

3、form2的设计

 

4、form2的代码

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        Form1 fm1;
        public Form2(Form1 fm1)
        {
            InitializeComponent();
            this.fm1 = fm1;
        }

        private void btClose_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form2_SizeChanged(object sender, EventArgs e)
        {
            //主窗体尺寸改变时,会触发子窗体的尺寸改变事件。
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            fm1.lbFm2.Text = textBox1.Text;
        }
    }

5、效果图

 2021年12月27日

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#可以使用Panel控件实现多窗体切换功能,具体步骤如下: 1. 建多个窗体Form,分别设置不同的窗体名称和内容。 2. 在主窗体添加一个Panel控件,用来容纳其他窗体的内容。 3. 在Panel控件选择一个默认的窗体,将其Visible属性设置为true,其他窗体设置为false。 4. 在主窗体添加按钮或菜单项来实现窗体的切换,每个按钮或菜单项都对应一个窗体。 5. 在按钮或菜单项的Click事件,将默认的窗体Visible属性设置为false,对应的窗体Visible属性设置为true,实现窗体的切换。 6. 可以通过传递参数的方式向窗体传递数据或触发相应的事件。 示例代码如下: //定义三个窗体 Form1 subForm1 = new Form1(); Form2 subForm2 = new Form2(); Form3 subForm3 = new Form3(); private void MainForm_Load(object sender, EventArgs e) { //将窗体添加到Panel控件,默认显示第一个窗体 panel1.Controls.Add(subForm1); panel1.Controls.Add(subForm2); panel1.Controls.Add(subForm3); subForm1.Visible = true; subForm2.Visible = false; subForm3.Visible = false; } private void btnSubForm1_Click(object sender, EventArgs e) { //显示第一个窗体,隐藏其他窗体 subForm1.Visible = true; subForm2.Visible = false; subForm3.Visible = false; } private void btnSubForm2_Click(object sender, EventArgs e) { //显示第二个窗体,隐藏其他窗体 subForm1.Visible = false; subForm2.Visible = true; subForm3.Visible = false; } private void btnSubForm3_Click(object sender, EventArgs e) { //显示第三个窗体,隐藏其他窗体 subForm1.Visible = false; subForm2.Visible = false; subForm3.Visible = true; } 在实际开发,可以根据需要扩展和优化该方法,比如使用Tab控件实现多窗体切换,使用MDI(多文档界面)实现多窗体间的交互等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值