C# .NET:ShowDialog关闭后刷新主窗体并显示更新列表
解决WinForms主窗体刷新列表的几种方案
我来给你几个实用的解决思路,都是WinForms开发里常用的做法,能完美解决你Form1关闭后主窗体MainNavigation刷新列表的需求:
方案1:模态窗口等待关闭后直接刷新
如果Form1是作为模态窗口打开(用户必须关闭它才能回到主窗体),这个方法最简单直接。用ShowDialog()代替Show()打开Form1,它会阻塞代码直到Form1关闭,之后直接调用刷新方法即可:
// MainNavigation中打开Form1的代码 private void btnOpenForm1_Click(object sender, EventArgs e) { // 把Model实例传给Form1,让它能操作列表 var form1 = new Form1(m_modelObj); // 模态打开Form1,直到用户关闭它才继续执行下面的代码 form1.ShowDialog(); // 调用自定义的刷新方法更新界面 RefreshListUI(); } // 自定义的列表刷新方法,根据你用的控件调整逻辑 private void RefreshListUI() { // 示例:如果用ListBox展示列表 listBoxItems.Items.Clear(); foreach (var item in m_modelObj.YourTargetList) { // 这里可以替换成显示类的特定属性,比如item.Name listBoxItems.Items.Add(item.ToString()); } // 示例:如果用DataGridView展示列表 // 先清空数据源再重新绑定,避免不刷新的问题 dataGridViewItems.DataSource = null; dataGridViewItems.DataSource = m_modelObj.YourTargetList; }
方案2:非模态窗口订阅FormClosed事件
如果Form1需要作为非模态窗口打开(用户可以同时操作主窗体和Form1),那就要订阅Form1的FormClosed事件,在它关闭时触发刷新:
// MainNavigation中打开Form1的代码 private void btnOpenForm1_Click(object sender, EventArgs e) { var form1 = new Form1(m_modelObj); // 订阅FormClosed事件,当Form1关闭时执行刷新逻辑 form1.FormClosed += (senderForm, eArgs) => { RefreshListUI(); }; // 非模态打开Form1 form1.Show(); }
方案3:自定义事件实现更灵活的刷新(可选)
如果需要更灵活的控制(比如Form1中添加完实例就实时刷新,不用等关闭),可以在Form1里定义一个自定义事件,当新实例添加完成时触发,主窗体订阅这个事件:
第一步:在Form1中定义事件
public partial class Form1 : Form { private Model m_modelObj; // 定义自定义事件 public event Action OnItemSaved; public Form1(Model modelObj) { InitializeComponent(); m_modelObj = modelObj; } // Form1中保存新实例的按钮点击事件 private void btnSaveItem_Click(object sender, EventArgs e) { // 创建新类实例并添加到Model的列表中 var newItem = new YourClass(); // 替换成你的类 m_modelObj.YourTargetList.Add(newItem); // 触发自定义事件(如果有订阅者则执行) OnItemSaved?.Invoke(); } }
第二步:在MainNavigation中订阅事件
private void btnOpenForm1_Click(object sender, EventArgs e) { var form1 = new Form1(m_modelObj); // 订阅自定义事件,实时刷新列表 form1.OnItemSaved += () => { RefreshListUI(); }; // 同时如果需要关闭时再统一刷新,也可以保留FormClosed事件 form1.FormClosed += (s, args) => RefreshListUI(); form1.Show(); }
注意事项
- 确保
RefreshListUI()方法是在UI线程中执行的,上面的几种方案都是在UI线程触发的事件,所以不会有跨线程控件访问的问题。 - 如果你用的是绑定数据源的控件(比如DataGridView),记得先清空数据源再重新绑定,避免控件不刷新的情况。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

