如何在关闭form2时刷新form1?

3

当关闭表单2时,我希望刷新表单1。我知道可以使用表单2的Closing事件,但我不知道如何操作。

谢谢

2个回答

4
一个很好的方法是使用中介者模式。这样,您的表单不必互相了解。允许中介者管理表单之间的交互,使每个单独的表单可以集中精力处理自己的责任。
一个非常简单的中介者实现如下:
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();
    }
}

现在,只要主表单关闭,子表单就会更新,两者都不需要知道对方的任何信息。
编辑:
好的,我将提供一个解决方案让您开始进行操作,但请注意,这只是中介者模式的一个基本实现。我强烈建议您阅读有关该模式以及设计模式的一般知识,以便更好地了解发生的情况。
再次说明,这只是一个示例,但它具有一些基本的错误检查,并应该能够使您开始工作。
您的表单声明将如下所示:
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);
    }
}

修改后的中介者实现看起来像这样:

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);
        }
    }
}

这实际上是一个设计模式。所以在Josh编写它之前,这个类并不存在。至于如何使用它,您的应用程序将创建它的一个实例,并设置它的MainForm和SubForm属性。 - GalacticCowboy
顺便说一句,如果这样更清晰的话,你可以将表单分别称为“SubscriberForm”和“SubscribedForm”。Subscriber是你想要刷新的那个,而Subscribed是你想要抓取其Close事件的那个。 - GalacticCowboy
太棒了,Josh。我把所有东西都插上了,它按照广告所说的一样工作!今晚我学到了新东西。谢谢! - JimDel
就像我说的那样,现在这样做还不错,但我强烈建议你阅读一些编程设计书籍。《代码大全》是一个很好的开始,它会让你开启一个全新的编程世界。 - Josh

2

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


我并不反对使用这个作为解决方案,但作为一个初学者,我从未使用过构造函数。所以我不确定你的意思是什么。 - JimDel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接