C# winform 在panel中切换子窗体,如何让被切换的子窗体各控件状态保持不变?

田凫。 2020-05-23 03:23:57
比如说我在子窗体1的checkbox点了钩,然后切换到下一个子窗体,再切换回子窗体1,checkbox的钩消失了,怎么能让控件记住勾选状态?
这是我用于在panel内显示不同子窗体的代码:

 this.panel1.Controls.Clear();//清空之前的内容
Form2 job1 = new Form2();//子窗体
job1.TopLevel = false;
this.panel1.Controls.Add(job1);
job1.Show();


本人C#初学者,还望能提供部分代码!
...全文
1261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bridge_go 2020-05-25
  • 打赏
  • 举报
回复
Form[] forms = new Form[8]; private void GetForm(int i) { Form frm = forms[i]; panel1.Controls.Clear(); frm.TopLevel = false; panel1.Controls.Add(frm); frm.Show(); } 放在大括号外面就行了
田凫。 2020-05-25
  • 打赏
  • 举报
回复
引用 6 楼 Bridge_go 的回复:
除了要把Form[] forms = new Form[8];设为全局变量,没看出有什么问题
那要如何设置呢?我实在不会额,跟C语言不一样
public static class frm
    {
       public static Form[] forms = new Form[8];
    }
像这样在窗体类后面单独再跟一个类嘛,但是这样写不行?
Bridge_go 2020-05-25
  • 打赏
  • 举报
回复
除了要把Form[] forms = new Form[8];设为全局变量,没看出有什么问题
田凫。 2020-05-25
  • 打赏
  • 举报
回复
引用 4 楼 EdsionWang 的回复:
[quote=引用 3 楼 曦光。 的回复:] [quote=引用 2 楼 EdsionWang 的回复:] 如果你每次都是这样new一个窗体出来,checkbox的状态肯定就没了。 Form2 job1 = new Form2();//子窗体 两种方法: 1.将Form内的控件状态记录下来,Form创建完成后,将数据绑定到控件上来显示。 2.切换Form的时候判断一下Form对象是否存在,如果在的话就Add到Panel上,而不是直接new一个新的对象出来添加到Panel上
你好,我之前在百度知道也提了问,有个网友也是这样提示的,还提供了如图的解决办法,但是我照做了还是做不出,能不能帮我看下他的方法有没有问题? https://zhidao.baidu.com/question/247534536773946124[/quote] 没有问题。其实核心思想就是:如果这个Form已经创建了,并且进行了一些操作(如选中checkbox),再次加载这个Form的话,就不能再new这个form出来。有点类似与隐藏这个Form,而不是Close这个Form。[/quote] 但是我这样还是不行,跟原来没区别,是我会错意了嘛?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 西门子
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //建立三个父节点
            TreeNode f1 = treeView1.Nodes.Add("Information");
            TreeNode f2 = treeView1.Nodes.Add("System");
            TreeNode f3 = treeView1.Nodes.Add("Layer 2");
            TreeNode f4 = treeView1.Nodes.Add("Layer 3(IPv4)");
            TreeNode f5 = treeView1.Nodes.Add("Layer 3(IPv6)");
            TreeNode f6 = treeView1.Nodes.Add("Security");


            //建立layer2
            TreeNode layer2S2 = new TreeNode("VLAN");
            TreeNode layer2S1 = new TreeNode("Ring Redundancy");
            TreeNode layer2S3 = new TreeNode("Spanning Tree");

            //VLAN
            TreeNode layer2S21 = new TreeNode("General");
            TreeNode layer2S22 = new TreeNode("Port Basic VLAN");

            //建立layer3
            TreeNode layer3S1 = new TreeNode("Configuration");
            TreeNode layer3S2 = new TreeNode("Subnet");

            //Subnet
            TreeNode layer3S11 = new TreeNode("Overview");
            TreeNode layer3S12 = new TreeNode("Subnet Configuration");

            //Layer2
            f3.Nodes.Add(layer2S1);
            f3.Nodes.Add(layer2S2);
            f3.Nodes.Add(layer2S3);
            //2.5
            layer2S2.Nodes.Add(layer2S21);
            layer2S2.Nodes.Add(layer2S22);

            //Layer3
            f4.Nodes.Add(layer3S1);
            f4.Nodes.Add(layer3S2);
            //3.5
            layer3S2.Nodes.Add(layer3S11);
            layer3S2.Nodes.Add(layer3S12);


            Form[] forms = new Form[8];
            forms[0] = new Form2();//子窗体    
            forms[1] = new Redundancy();//子窗体    
            forms[2] = new SpanningTree();//子窗体    
            forms[3] = new VLANGeneral();//子窗体    
            forms[4] = new PortBasicVLAN();//子窗体    
            forms[5] = new Layer3Configuration();//子窗体    
            forms[6] = new SubnetOverview();//子窗体    
            forms[7] = new SubnetConfiguration();//子窗体  


        }

        private void GetForm(int i)
        {
            Form frm = forms[i];
            panel1.Controls.Clear();
            frm.TopLevel = false;
            panel1.Controls.Add(frm);
            frm.Show();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {


            if (e.Node.Text.ToString() == "Information")
            {
                GetForm(0);
            }
            if (e.Node.Text.ToString() == "Ring Redundancy")
            {
                GetForm(1);
            }
            if (e.Node.Text.ToString() == "Spanning Tree")
            {
                GetForm(2);
            }
            if (e.Node.Text.ToString() == "General")
            {
                GetForm(3);
            }
            if (e.Node.Text.ToString() == "Port Basic VLAN")
            {
                GetForm(4);
            }

            //if (e.Node.Text.ToString() == "VLAN")
            //{
            //    this.panel1.Controls.Clear();//清空之前的内容
            //    VLAN job = new VLAN();//子窗体 
            //    job.MdiParent = this;
            //    job.TopLevel = false;
            //    this.panel1.Controls.Add(job);
            //    job.Show();
            //}
            if (e.Node.Text.ToString() == "Configuration")
            {
                GetForm(5);

            }
            if (e.Node.Text.ToString() == "Overview")
            {
                GetForm(6);
            }
            if (e.Node.Text.ToString() == "Subnet Configuration")
            {
                GetForm(7);
            }
        }
    }
}
EdsionWang 2020-05-25
  • 打赏
  • 举报
回复
引用 3 楼 曦光。 的回复:
[quote=引用 2 楼 EdsionWang 的回复:] 如果你每次都是这样new一个窗体出来,checkbox的状态肯定就没了。 Form2 job1 = new Form2();//子窗体 两种方法: 1.将Form内的控件状态记录下来,Form创建完成后,将数据绑定到控件上来显示。 2.切换Form的时候判断一下Form对象是否存在,如果在的话就Add到Panel上,而不是直接new一个新的对象出来添加到Panel上
你好,我之前在百度知道也提了问,有个网友也是这样提示的,还提供了如图的解决办法,但是我照做了还是做不出,能不能帮我看下他的方法有没有问题? https://zhidao.baidu.com/question/247534536773946124[/quote] 没有问题。其实核心思想就是:如果这个Form已经创建了,并且进行了一些操作(如选中checkbox),再次加载这个Form的话,就不能再new这个form出来。有点类似与隐藏这个Form,而不是Close这个Form。
田凫。 2020-05-25
  • 打赏
  • 举报
回复
引用 2 楼 EdsionWang 的回复:
如果你每次都是这样new一个窗体出来,checkbox的状态肯定就没了。 Form2 job1 = new Form2();//子窗体 两种方法: 1.将Form内的控件状态记录下来,Form创建完成后,将数据绑定到控件上来显示。 2.切换Form的时候判断一下Form对象是否存在,如果在的话就Add到Panel上,而不是直接new一个新的对象出来添加到Panel上
你好,我之前在百度知道也提了问,有个网友也是这样提示的,还提供了如图的解决办法,但是我照做了还是做不出,能不能帮我看下他的方法有没有问题? https://zhidao.baidu.com/question/247534536773946124
EdsionWang 2020-05-25
  • 打赏
  • 举报
回复
如果你每次都是这样new一个窗体出来,checkbox的状态肯定就没了。 Form2 job1 = new Form2();//子窗体 两种方法: 1.将Form内的控件状态记录下来,Form创建完成后,将数据绑定到控件上来显示。 2.切换Form的时候判断一下Form对象是否存在,如果在的话就Add到Panel上,而不是直接new一个新的对象出来添加到Panel上
EdsionWang 2020-05-25
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 西门子
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
            Form[] forms = new Form[8];
        private void Form1_Load(object sender, EventArgs e)
        {
            //建立三个父节点
            TreeNode f1 = treeView1.Nodes.Add("Information");
            TreeNode f2 = treeView1.Nodes.Add("System");
            TreeNode f3 = treeView1.Nodes.Add("Layer 2");
            TreeNode f4 = treeView1.Nodes.Add("Layer 3(IPv4)");
            TreeNode f5 = treeView1.Nodes.Add("Layer 3(IPv6)");
            TreeNode f6 = treeView1.Nodes.Add("Security");


            //建立layer2
            TreeNode layer2S2 = new TreeNode("VLAN");
            TreeNode layer2S1 = new TreeNode("Ring Redundancy");
            TreeNode layer2S3 = new TreeNode("Spanning Tree");

            //VLAN
            TreeNode layer2S21 = new TreeNode("General");
            TreeNode layer2S22 = new TreeNode("Port Basic VLAN");

            //建立layer3
            TreeNode layer3S1 = new TreeNode("Configuration");
            TreeNode layer3S2 = new TreeNode("Subnet");

            //Subnet
            TreeNode layer3S11 = new TreeNode("Overview");
            TreeNode layer3S12 = new TreeNode("Subnet Configuration");

            //Layer2
            f3.Nodes.Add(layer2S1);
            f3.Nodes.Add(layer2S2);
            f3.Nodes.Add(layer2S3);
            //2.5
            layer2S2.Nodes.Add(layer2S21);
            layer2S2.Nodes.Add(layer2S22);

            //Layer3
            f4.Nodes.Add(layer3S1);
            f4.Nodes.Add(layer3S2);
            //3.5
            layer3S2.Nodes.Add(layer3S11);
            layer3S2.Nodes.Add(layer3S12);


            forms[0] = new Form2();//子窗体    
            forms[1] = new Redundancy();//子窗体    
            forms[2] = new SpanningTree();//子窗体    
            forms[3] = new VLANGeneral();//子窗体    
            forms[4] = new PortBasicVLAN();//子窗体    
            forms[5] = new Layer3Configuration();//子窗体    
            forms[6] = new SubnetOverview();//子窗体    
            forms[7] = new SubnetConfiguration();//子窗体  


        }

        private void GetForm(int i)
        {
            panel1.Controls.Clear();
            frm.TopLevel = false;
            panel1.Controls.Add(forms[i]);
            frm.Show();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {


            if (e.Node.Text.ToString() == "Information")
            {
                GetForm(0);
            }
            if (e.Node.Text.ToString() == "Ring Redundancy")
            {
                GetForm(1);
            }
            if (e.Node.Text.ToString() == "Spanning Tree")
            {
                GetForm(2);
            }
            if (e.Node.Text.ToString() == "General")
            {
                GetForm(3);
            }
            if (e.Node.Text.ToString() == "Port Basic VLAN")
            {
                GetForm(4);
            }

            //if (e.Node.Text.ToString() == "VLAN")
            //{
            //    this.panel1.Controls.Clear();//清空之前的内容
            //    VLAN job = new VLAN();//子窗体 
            //    job.MdiParent = this;
            //    job.TopLevel = false;
            //    this.panel1.Controls.Add(job);
            //    job.Show();
            //}
            if (e.Node.Text.ToString() == "Configuration")
            {
                GetForm(5);

            }
            if (e.Node.Text.ToString() == "Overview")
            {
                GetForm(6);
            }
            if (e.Node.Text.ToString() == "Subnet Configuration")
            {
                GetForm(7);
            }
        }
    }
}

田凫。 2020-05-24
  • 打赏
  • 举报
回复
没人帮下忙嘛!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧