C# WinForm无需打开第二窗体跨窗体传值及列表数据保存问题
解决方案
核心问题根因
你当前的两个问题本质是同一个原因导致:所有窗体都各自独立实例化了Controller对象,每个Controller的客户列表是互相隔离的,没有共用同一份数据源。
问题1:Form1与Form2客户列表同步实现
完全可以实现,无需提前打开Form2,调整方案如下:
- 首先在Program类中声明全局共用的
Controller实例,保证所有窗体都访问同一份数据源:
static class Program { // 全局静态Controller,整个程序运行周期内仅存在一份 public static Controller SharedController = new Controller(); [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }
- 修改Form1的Controller引用,不再自行实例化:
把Form1代码里的Controller control = new Controller();替换为:
Controller control = Program.SharedController;
- 修改Form2的Controller引用,同样使用全局实例:
把Form2代码里的Controller control = new Controller();替换为:
Controller control = Program.SharedController;
调整完成后,你在Form1点击添加按钮新增的客户都会存入全局的Controller列表中,Form2不管什么时候打开,构造函数里调用的DisplayCustomers()都会自动加载最新的客户列表,完全不需要提前打开Form2。
问题2:关闭Form1重新打开数据不丢失实现
完成上面的全局数据源调整后,这个问题会自动解决:
全局SharedController的生命周期和整个程序一致,只要不关闭整个程序,客户列表数据会一直保留。你每次重新打开Form1时,构造函数调用的DisplayCustomers()会直接从全局列表中加载所有历史客户,不会出现数据丢失的情况。
注意事项
你提供的Form2代码存在笔误:Form2类的构造函数名写为FormAccounts,和类名不符,需要修改为public Form2()否则会编译报错。
内容的提问来源于stack exchange,提问作者DJ Dog
相关产品推荐
相关产品推荐

