DialogResult, который не закрывает форму?

У меня есть форма Form1 из которого я показываю Form2 как модальная форма. От Form2 Я делаю все виды редактирования и удаления различного набора значений, которые должны быть отражены в Form1 после закрытия Form2, Так что я делаю RePopulateControls_in_Form1() после закрытия Form2, поскольку RePopulateControls_in_Form1()это долгий процесс, я хочу выполнить этот метод, только если происходит какое-либо изменение (редактировать, добавлять, удалять) в Form2 а не когда Form2 просто открывается и закрывается.

Вот что я пытаюсь сделать в Form1:

        Form2 f = new Form2();
        if (f.ShowDialog(this) == DialogResult.Something)
            RePopulateControls_in_Form1()

И тогда в Form2 я делаю,

    private void bntEdit()
    {
        //If Edit?
        this.DialogResult = DialogResult.Something;
    }
    private void bntAdd()
    {
        //If Add?
        this.DialogResult = DialogResult.Something;
    }
    private void bntDelete()
    {
        //If Delete?
        this.DialogResult = DialogResult.Something;
    }

Но моя проблема .Something, Если это что-то кроме .None, Form2 просто закрывается. я не хочу Form2 просто закрыться самостоятельно, если пользователь не закроет его.

Если я сделаю это:

    //in Form1
    private void Form1_Click()
    {
        Form2 f = new Form2();
        if (f.ShowDialog(this) == DialogResult.None)
            RePopulateControls_in_Form1()
    }

    //in Form2
    private void Form2_SomeModification()
    {
        //If Modified?
        this.DialogResult = DialogResult.None;
    }

RePopulateControls_in_Form1() не ударил!

Короче говоря, в моей программе, как я могу сказать компилятору вызвать RePopulateControls_in_Form1() только если значения изменены в Form2?

Примечание. Повторное заполнение обязательно требуется, поскольку элементы управления создаются динамически и немного сложны (на самом деле то, что создается в Form2 это элементы управления графическим интерфейсом, его метки и т. д.).

3 ответа

Решение

Установка DialogResult в форме скрывает форму и возвращает из ShowDialog. Если вы хотите отложить это до тех пор, пока пользователь не выполнит какое-либо другое действие (например, закрытие формы), вы должны сохранить это состояние как поле члена и установить DialogResult в обработчике для Form.Closing.

Также, если вы хотите отклонить модальную форму при нажатии кнопки, вы можете использовать свойство Button.DialogResult вместо создания обработчика Button.Click.

Простой способ - вообще не использовать DialogResult, а выделенное свойство, не влияющее на поведение формы. - Тогда вы сможете программировать любую логику, какую захотите.

Я бы использовал событие в Форме 2. Запустите это событие, когда ваша Форма2 закрывается. Обработка этого события в Form1 позволит вам выполнить любую обработку, какую вы захотите. Далее, если потребуется, вы можете передать некоторую информацию из Form 2 в Form1 в параметрах к событию.

Альтернативой может быть установка статической переменной Global - возможно, просто bool. Затем Form 2 может установить для него значение true или false в зависимости от того, были ли внесены изменения. Form1 может прочитать это, когда Form 2 вернется, и если true, выполнить обработку и установить ее обратно в false.

Другие вопросы по тегам