如何在secondForm中调用mainForm的非静态OpenChildForm方法打开thirdForm
WinForm跨窗体调用OpenChildForm方法的非静态实现方案
以下是几种无需将OpenChildForm改为静态,即可从secondForm调用mainForm该方法的可行方案:
方案一:构造函数传递MainForm实例
创建secondForm时,将当前mainForm的实例通过构造函数传入,在secondForm中保存该实例,后续点击事件直接调用其OpenChildForm方法。
实现代码:
- 修改
secondForm的代码:
public partial class secondForm : Form { private readonly mainForm _mainForm; public secondForm(mainForm mainForm) { InitializeComponent(); _mainForm = mainForm; } private void btnOpenThirdForm_Click(object sender, EventArgs e) { thirdForm third = new thirdForm(); _mainForm.OpenChildForm(third); } }
- 在
mainForm中打开secondForm时传入自身实例:
secondForm second = new secondForm(this); OpenChildForm(second);
方案二:利用Form.Owner属性
打开secondForm时设置其Owner为当前mainForm,在secondForm中通过Owner属性获取mainForm实例并调用方法。
实现代码:
- 在
mainForm中打开secondForm时设置Owner:
secondForm second = new secondForm(); second.Owner = this; OpenChildForm(second);
- 在
secondForm的点击事件中转换Owner并调用方法:
private void btnOpenThirdForm_Click(object sender, EventArgs e) { if (Owner is mainForm mainForm) { thirdForm third = new thirdForm(); mainForm.OpenChildForm(third); } }
方案三:使用事件委托(低耦合推荐)
通过事件解耦secondForm和mainForm,secondForm仅负责触发事件,mainForm订阅事件并执行OpenChildForm操作。
实现代码:
- 在
secondForm中定义事件:
public partial class secondForm : Form { public event Action<Form> RequestOpenChildForm; private void btnOpenThirdForm_Click(object sender, EventArgs e) { thirdForm third = new thirdForm(); RequestOpenChildForm?.Invoke(third); } }
- 在
mainForm中打开secondForm时订阅事件:
secondForm second = new secondForm(); second.RequestOpenChildForm += (form) => OpenChildForm(form); OpenChildForm(second);
额外优化:简化你的OpenChildForm方法
原方法存在重复代码,可优化为:
public void OpenChildForm(Form ChildForm) { activeForm?.Close(); activeForm = ChildForm; ChildForm.TopLevel = false; ChildForm.FormBorderStyle = FormBorderStyle.None; ChildForm.Dock = DockStyle.Fill; panelChildForm.Controls.Add(ChildForm); panelChildForm.Tag = ChildForm; ChildForm.BringToFront(); ChildForm.Show(); }
内容的提问来源于stack exchange,提问作者R Kay
相关产品推荐
相关产品推荐

