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

如何修复C# WinForms代码以实现多次调用时重新加载窗体?

解决C#子窗体重复显示时Load/Shown事件不触发的问题

问题原因

你在主窗体中只创建了一次AttributesInput实例,Load()和Shown()事件仅在窗体第一次被加载并显示时触发。后续点击按钮时,只是将已加载的窗体重新显示,不会再次触发这两个事件。

解决方案

方案1:每次点击按钮创建新的窗体实例

把窗体实例的创建放到按钮点击事件内部,每次点击都生成新的窗体对象,这样每次显示都会触发Load和Shown事件:

private void btnShowAttributes_Click(object sender, EventArgs e)
{
    // 先移除panel里已有的AttributesInput窗体(避免重复添加)
    var existingForm = panelMain.Controls.OfType<AttributesInput>().FirstOrDefault();
    if (existingForm != null)
    {
        panelMain.Controls.Remove(existingForm);
        existingForm.Dispose(); // 释放资源
    }

    // 创建新实例并显示
    AttributesInput frmAttributes = new AttributesInput();
    frmAttributes.TopLevel = false;
    frmAttributes.Dock = DockStyle.Fill;
    panelMain.Controls.Add(frmAttributes);
    frmAttributes.Show();
}

方案2:手动触发事件(复用同一个实例)

如果想要复用同一个窗体实例,可以在每次显示前手动调用OnLoad()和OnShown()方法(注意要确保窗体还未被Disposed):

// 主窗体中声明的全局实例
private AttributesInput frmAttributes;

private void btnShowAttributes_Click(object sender, EventArgs e)
{
    if (frmAttributes == null || frmAttributes.IsDisposed)
    {
        // 第一次创建或实例已被释放时重新创建
        frmAttributes = new AttributesInput();
        frmAttributes.TopLevel = false;
        frmAttributes.Dock = DockStyle.Fill;
        panelMain.Controls.Add(frmAttributes);
    }
    else
    {
        // 手动触发Load和Shown事件
        frmAttributes.OnLoad(new EventArgs());
        frmAttributes.OnShown(new EventArgs());
    }
    frmAttributes.Show();
}

注意:手动触发事件时要确认逻辑是否适合,避免重复执行初始化代码导致问题。

方案3:控制窗体的显示/隐藏(而非重复添加)

如果只是切换显示状态,可以先将窗体隐藏,需要时再显示,同时在需要重新初始化的地方单独写方法调用:

private AttributesInput frmAttributes;

private void btnShowAttributes_Click(object sender, EventArgs e)
{
    if (frmAttributes == null)
    {
        frmAttributes = new AttributesInput();
        frmAttributes.TopLevel = false;
        frmAttributes.Dock = DockStyle.Fill;
        panelMain.Controls.Add(frmAttributes);
    }
    
    // 如果需要每次显示都执行初始化逻辑,调用自定义的初始化方法
    frmAttributes.ReInitialize(); 
    
    frmAttributes.Show();
    frmAttributes.BringToFront(); // 确保显示在最上层
}

// 在AttributesInput窗体中添加自定义初始化方法
public void ReInitialize()
{
    // 这里写原本在Load/Shown事件里的初始化逻辑
}

内容的提问来源于stack exchange,提问作者Jib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:04:56