才学几天C#,请教一个关于窗体切换的问题,我在窗体相互切换后,切换回原窗体数据都没了

weixin_48367809 2021-03-23 09:50:53
我有很多窗体需要切换,每个窗体都有textbox控件,但是只要我运行程序,在textbox里写东西,切换窗口再切回来,textbox里就没有内容了。我想是窗体内容能够保留。

我知道原因可能是,每次按钮点击都是new了一个新窗体,所以才没有内容的。
但我不知道如何改.....
大概知道的方法有,切换前将窗体内的内容保存,new的时候再赋值,但我不知道怎么保存,保存在哪?
还有一种方法是,new之前做一个判断,看是否存在这个实体,有的话就不new了,但我还是不会。。
刚学C#几天,就被拿来做项目了,求大佬帮解决,感激!
...全文
2192 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
damixie 2021-03-27
  • 打赏
  • 举报
回复
新建窗口导致数据丢失,通过新建一次窗口对象后用show,hide来显示,隐藏窗口
jhonsonzhang 2021-03-26
  • 打赏
  • 举报
回复
public class myForm:windows.forms { public myform{ //构造 这里可以注入需要的接口; } //相关属性和方法可以重写在里面; } 主线程调用 var curForm=myForm(//可以注入当前接口)。
morliz子轩 2021-03-26
  • 打赏
  • 举报
回复
引用 8 楼 weixin_48367809 的回复:
执行顺序是先要构造本身,产生一个Load()事件后,再加载其它的处理逻辑。 如果只是放在类中做为申明来处理,那调用的时候,都只会以new的方式进行产生新的对象。
[/quote] 你这样做,不就是我上面写的这句话本身的意思?只申明并做实例化。 每调用一次,就实例化一次。看明白没有
weixin_48367809 2021-03-26
  • 打赏
  • 举报
回复 1
引用 7 楼 morliz子轩 的回复:
[quote=引用 5 楼 weixin_48367809 的回复:]感谢各位的回复,我已经解决了,通过在主窗口load对所有窗口都进行实例化。

但是再多问一句,为什么实例话new的过程,不能直接放在public Form2 f2;这一句里面直接来实例化呢?必须要放在load或某个事件里吗?


public Form()所谓的构造函数。
Form_Load所谓的窗体加载函数
完全两码事!

Form()是程序入口,它的InitializeComponent()
做了许多初始化的工作,所以Load才能成为一个事件,InitializeComponent为你的程序作了必要的初始化工作
Form_Load:装载窗口事件, 是窗体启动时触发的事件

执行顺序是先要构造本身,产生一个Load()事件后,再加载其它的处理逻辑。
如果只是放在类中做为申明来处理,那调用的时候,都只会以new的方式进行产生新的对象。[/quote]

感谢回复!我是说不能这样写吗?不是在构造函数里来new,也不是在load里new,而是在这里。这样可以吗?
morliz子轩 2021-03-26
  • 打赏
  • 举报
回复
引用 5 楼 weixin_48367809 的回复:
感谢各位的回复,我已经解决了,通过在主窗口load对所有窗口都进行实例化。 但是再多问一句,为什么实例话new的过程,不能直接放在public Form2 f2;这一句里面直接来实例化呢?必须要放在load或某个事件里吗?
public Form()所谓的构造函数。 Form_Load所谓的窗体加载函数 完全两码事! Form()是程序入口,它的InitializeComponent() 做了许多初始化的工作,所以Load才能成为一个事件,InitializeComponent为你的程序作了必要的初始化工作 Form_Load:装载窗口事件, 是窗体启动时触发的事件 执行顺序是先要构造本身,产生一个Load()事件后,再加载其它的处理逻辑。 如果只是放在类中做为申明来处理,那调用的时候,都只会以new的方式进行产生新的对象。
weixin_48367809 2021-03-25
  • 打赏
  • 举报
回复
感谢各位的回复,我已经解决了,通过在主窗口load对所有窗口都进行实例化。

但是再多问一句,为什么实例话new的过程,不能直接放在public Form2 f2;这一句里面直接来实例化呢?必须要放在load或某个事件里吗?
Forrest Gump plus 2021-03-24
  • 打赏
  • 举报
回复
解决办法: 1.切换之前,将这些数据存到一个集合或者类中,然后在load时,将这个数据加载出来。 2.使用委托+事件的方式,实现两个窗体之间的回调,切换窗口使用visible属性。这样就可以保证你每次用的窗体都是之前的,而不是new出来的。 具体实例如下: MainView.cs
        
       Form1 frm = new Form1();
        public MainView()
        {
            InitializeComponent();
            if (!mvvmContext1.IsDesignMode)
                InitializeBindings();
            //激活form1的委托事件方法,给该事件传方法
            frm.ShowEvent += () =>
            {
                this.Visible = true;//将本窗体隐藏
            };
        }
        private void button5_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            frm.Show();//打开Form1窗体
            frm.Visible = true;//Form1显示
        }
Form1.cs
        
        public delegate void ShowDelegate();//委托方法
        public event ShowDelegate ShowEvent;//事件方法
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            if (null != ShowEvent)
            {
                ShowEvent();//这样事件就可以调用MainView窗体的Visible的值,将MainView窗体显示
                this.Visible = false;//将本窗体隐藏
            }
            else
            {
                MessageBox.Show("不能显示窗口");
            }
        }
Bridge_go 2021-03-24
  • 打赏
  • 举报
回复 1
        Form1 _form1 = new Form1();
        Form2 _form2 = new Form2();
        private void button1_Click(object sender, EventArgs e)
        {
            OpenForm(_form1);
        }

        void OpenForm(Form form)
        {
            form.TopLevel = false;
            form.TopMost = false;
            if (!this.panel1.Controls.Contains(form))
            {
                this.panel1.Controls.Add(form);
            }
            foreach (Control c in this.panel1.Controls)
            {
                c.Visible = c == form;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenForm(_form2);
        }
morliz子轩 2021-03-24
  • 打赏
  • 举报
回复
引用 楼主 weixin_48367809 的回复:
我有很多窗体需要切换,每个窗体都有textbox控件,但是只要我运行程序,在textbox里写东西,切换窗口再切回来,textbox里就没有内容了。我想是窗体内容能够保留。 我知道原因可能是,每次按钮点击都是new了一个新窗体,所以才没有内容的。 但我不知道如何改..... 大概知道的方法有,切换前将窗体内的内容保存,new的时候再赋值,但我不知道怎么保存,保存在哪? 还有一种方法是,new之前做一个判断,看是否存在这个实体,有的话就不new了,但我还是不会。。 刚学C#几天,就被拿来做项目了,求大佬帮解决,感激!
这个不是很难的东西。看Demo

public partial class FrmMdiUserlim : DevExpress.XtraEditors.XtraForm
    {
        //申明本窗体对象
        public static FrmMdiUserlim frmMDIUserlim { get; set; }

        public FrmMdiUserlim()
        {
            InitializeComponent();
            frmMDIUserlim = this;
        }

        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="frm">来源窗体</param>
        public void NewfrmMDIUser(DevExpress.XtraEditors.XtraForm frm)
        {
            foreach (Control ctl in groupBox1.Controls)
            {
                if (ctl is CusPro.FormsUI.Docking.CusTextBox)
                {
                    (ctl as CusPro.FormsUI.Docking.CusTextBox).Text = "";
                    (ctl as CusPro.FormsUI.Docking.CusTextBox).ReadOnly = false;
                }

                if (ctl is CusPro.FormsUI.Docking.CusLookUpEdit)
                {
                    (ctl as CusPro.FormsUI.Docking.CusLookUpEdit).Text = "";
                    (ctl as CusPro.FormsUI.Docking.CusLookUpEdit).ReadOnly = false;
                }

                if (ctl is CusPro.FormsUI.Docking.CusComboBoxEdit)
                {
                    (ctl as CusPro.FormsUI.Docking.CusComboBoxEdit).Text = "";
                    (ctl as CusPro.FormsUI.Docking.CusComboBoxEdit).ReadOnly = false;
                }

                if (ctl is DevExpress.XtraEditors.CheckEdit)
                {
                    (ctl as DevExpress.XtraEditors.CheckEdit).ReadOnly = true;
                    (ctl as DevExpress.XtraEditors.CheckEdit).Enabled = false;
                }
            }

            label13.Enabled = false;
            tBoxValdate.Enabled = false;
            tBoxValdate.ReadOnly = true;

            //生成相关编号信息
            tBoxLogno.Text = ContextHelper.ExecUserLogno();
            tBoxLogno.ReadOnly = true;

            //界面方案
            cmbProjna.SelectedIndex = 0;
            //用户级别
            cmbUserlev.SelectedIndex = 3;       //默认项
            //用户类型
            cmbUsertype.SelectedIndex = 0;

            frm.ShowDialog();
            frm.Activate();     //子窗体获得焦点
        }
}

//调用的窗体:
public partial class FrmUserlim : BaseDock
{
public FrmUserlim()
        {
            InitializeComponent();
            FrmMdiUserlim.frmMDIUserlim = new FrmMdiUserlim();
        }

        /// <summary>
        /// 新增记录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BarBtnAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            IsActState = 0;
            if ((int)Portal.gc.UserInfo.Userlev == 3) return;
            FrmMdiUserlim.frmMDIUserlim.NewfrmMDIUser(FrmMdiUserlim.frmMDIUserlim);

            //重载gridCtl数据
            InitData();
            gridView1.FocusedRowHandle = gridView1.DataRowCount - 1;    //焦点指向最后一行

        }
}
这样调用的窗体对象或者方法,都会传递过来,而不是New一个新的。
兔子-顾问 2021-03-24
  • 打赏
  • 举报
回复
Load事件中读取文本保存的数据,放入文本框 Closing事件中吧文本内容保存下来 具体保存哪里看你需要,可以创建一个静态或单例模式的公共的类来存放,也可以创建一个文件,或是存入注册表。

111,092

社区成员

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

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

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