从其他窗体调用主窗体resettimer方法无效,如何解决?
问题分析与解决方案
嘿,我一眼就发现问题出在哪了!你当前的代码根本没操作到正在运行的主窗体实例,自然触发不了想要的效果。
核心问题
你在btn_doorgaan_Click方法里新建了一个Bib_main的实例MainMenu:
Bib_main MainMenu = new Bib_main();
这个新创建的对象和你正在运行的主窗体完全是两个独立的实例,你调用的是这个全新对象的resettimer()方法,它根本不会影响到原来那个主窗体里的ShutdownTimer计时器。
两种可行的解决方案
方案1:传递主窗体引用给子窗体
这是最稳妥的方式,在打开子窗体时把主窗体的实例传递过去:
- 修改子窗体的构造函数,添加参数接收主窗体实例:
// 子窗体类中定义成员变量保存主窗体引用 private Bib_main _mainForm; // 子窗体构造函数 public YourSubFormName(Bib_main mainForm) { InitializeComponent(); _mainForm = mainForm; }
- 在主窗体中打开子窗体时,传入自身实例:
// 主窗体中打开子窗体的代码 YourSubFormName subForm = new YourSubFormName(this); subForm.Show();
- 子窗体的按钮点击事件中调用主窗体的方法:
private void btn_doorgaan_Click(object sender, EventArgs e) { _mainForm.resettimer(); }
方案2:通过Application.OpenForms获取已打开的主窗体
如果没办法提前传递引用,可以通过这个集合找到正在运行的主窗体实例:
private void btn_doorgaan_Click(object sender, EventArgs e) { // 从已打开的窗体中查找Bib_main实例 var mainForm = Application.OpenForms.OfType<Bib_main>().FirstOrDefault(); if (mainForm != null) { mainForm.resettimer(); } }
注意:这种方式需要引用
System.Linq命名空间,否则OfType和FirstOrDefault方法会报错。
内容的提问来源于stack exchange,提问作者Robin De Paepe
相关产品推荐
相关产品推荐

