كيف يمكنني الحصول على Form1 للتحديث عندما أغلق Form2

StackOverflow https://stackoverflow.com/questions/930845

  •  06-09-2019
  •  | 
  •  

سؤال

أنا أتطلع إلى تحديث form1 عند إغلاق النموذج 2. أعرف استخدام حدث إغلاق من 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) على الحدث الإغلاق في Form2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top