You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:32