繁体   English   中英

当我关闭form2时,如何让form1刷新

[英]How can I get form1 to refresh when I close form2

我希望在表单2关闭时刷新form1。 我知道要使用form2中的Closing事件,但这就是我迷失的地方。

谢谢

实现此目的的一个好方法是使用Mediator模式。 通过这种方式,您的表单不必彼此了解。 允许Mediator管理表单之间的交互,以便每个表单可以集中于自己的职责。

一个非常粗糙的Mediator可以实现你想要的东西,可以这样实现:

public class FormMediator
{
    public Form MainForm { private get; set; }
    public Form SubForm { private get; set; }

    public void InitializeMediator()
    {
        MainForm.FormClosed += MainForm_FormClosed;
    }

    void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        SubForm.Refresh();
    }
}

现在,只要主窗体关闭,您的子窗体就会更新,并且不必彼此了解任何内容。

编辑:

好的,所以我将把这个解决方案拿出来让你开始,但请注意,这只是Mediator模式的基本实现。 我强烈建议你阅读一下这种模式,并一般地设计模式,以便更好地了解正在发生的事情。

同样,这是一个示例,但它确实有一些基本的错误检查,应该让你去。

您的表单声明将如下所示:

public partial class MainForm : Form
{
    private FormMediator _formMediator;

    public MainForm()
    {
        InitializeComponent();
    }

    public void SomeMethodThatOpensTheSubForm()
    {
        SubForm subForm = new SubForm();

        _formMediator = new FormMediator(this, subForm);

        subForm.Show(this);
    }
}

而Mediator的修改后的实现将如下所示:

public class FormMediator
{
    private Form _subForm;
    private Form _mainForm;

    public FormMediator(Form mainForm, Form subForm)
    {
        if (mainForm == null)
            throw new ArgumentNullException("mainForm");

        if (subForm == null)
            throw new ArgumentNullException("subForm");

        _mainForm = mainForm;
        _subForm = subForm;

        _subForm.FormClosed += MainForm_FormClosed;
    }

    void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        try
        {
            _mainForm.Refresh();
        }
        catch(NullReferenceException ex)
        {
            throw new InvalidOperationException("Unable to close the Main Form because the FormMediator no longer has a reference to it.", ex);
        }
    }
}

一种解决方案是在构造函数中将Form1的引用传递给Form2,并在Form2的结束事件上调用f1.Invalidate(true)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM