문제

양식 2가 닫히면 Form1을 새로 고치고 자합니다. 나는 Form2의 마감 이벤트를 사용한다는 것을 알고 있지만, 그 곳은 내가 길을 잃는 곳입니다.

감사

도움이 되었습니까?

해결책

이를 달성하는 좋은 방법은 중재자 패턴을 사용하는 것입니다. 이런 식으로 당신의 양식은 반드시 서로에 대해 알 필요는 없습니다. 중재자가 양식 간의 상호 작용을 관리하도록 허용하여 각 개별 양식이 자체 책임에 집중할 수 있습니다.

원하는 것을 달성 할 수있는 매우 조잡한 중재자는 그렇게 구현 될 수 있습니다.

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

다른 팁

하나의 해결책은 생성자에서 Form1의 참조를 전달하고 Form2의 마감 이벤트에서 f1.invalidate (true)를 호출하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top