如何在C#中实现窗体2关闭时自动执行窗体1的FormLoad逻辑
解决方案
首先建议你把窗体1的加载数据逻辑提取成独立方法,方便复用,避免重复代码:
// CustomerOverViewV1 窗体代码 private void CustomerOverViewV1_Load(object sender, EventArgs e) { LoadCustomerData(); } // 独立的加载数据方法 private void LoadCustomerData() { CustomerManagement.GetCustomerPoliciesForOverview(); Thread.Sleep(1000); // 注意:这个方法会阻塞UI线程,导致窗体假死,建议换成异步等待(见下文) CustomerManagement.GetCustomerOverViewV1(); CustomerManagement.GetCustomerOverviewNote(); SQLBilling.GetOverviewBillingDetails(); }
下面提供两种常用的实现方式:
方式1:利用ShowDialog返回值判断
在窗体1中打开窗体2时使用ShowDialog(),通过返回值判断是否需要刷新数据:
// 在CustomerOverViewV1中打开窗体2的代码 private void OpenCustomerDetailsForm() { CustomerDetailsForm form2 = new CustomerDetailsForm(); // 以模态方式打开窗体2 if (form2.ShowDialog() == DialogResult.OK) { // 窗体2点击确定关闭后,触发数据刷新 LoadCustomerData(); } }
同时在窗体2的确定按钮事件中设置返回值:
// 窗体2的确定按钮点击事件 private void btnOK_Click(object sender, EventArgs e) { // 执行你的数据库更新逻辑 UpdateCustomerDetails(); // 设置DialogResult为OK,让窗体1能捕捉到 this.DialogResult = DialogResult.OK; this.Close(); }
方式2:通过自定义事件触发刷新
如果窗体2是非模态打开(用Show()),可以通过自定义事件通知窗体1刷新:
步骤1:在窗体2中定义事件
// CustomerDetailsForm 窗体代码 // 定义客户更新完成事件 public event EventHandler CustomerUpdated; private void btnOK_Click(object sender, EventArgs e) { // 执行数据库更新逻辑 UpdateCustomerDetails(); // 触发事件,通知订阅者(窗体1)刷新数据 CustomerUpdated?.Invoke(this, EventArgs.Empty); this.Close(); }
步骤2:在窗体1中订阅事件
// 在CustomerOverViewV1中打开窗体2的代码 private void OpenCustomerDetailsForm() { CustomerDetailsForm form2 = new CustomerDetailsForm(); // 订阅事件 form2.CustomerUpdated += (sender, args) => { LoadCustomerData(); }; form2.Show(); }
优化建议
你代码中的Thread.Sleep(1000)会阻塞UI线程,导致窗体卡顿假死,建议替换为异步等待:
// 改成异步方法 private async void LoadCustomerData() { CustomerManagement.GetCustomerPoliciesForOverview(); await Task.Delay(1000); // 异步等待,不阻塞UI CustomerManagement.GetCustomerOverViewV1(); CustomerManagement.GetCustomerOverviewNote(); SQLBilling.GetOverviewBillingDetails(); }
内容的提问来源于stack exchange,提问作者Tom Dobing
相关产品推荐
相关产品推荐

