DialogResult, который не закрывает форму? - PullRequest
6 голосов
/ 30 июля 2011

У меня есть форма 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()

А затем в Форме2 я делаю,

    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 ]

10 голосов
/ 30 июля 2011

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

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

2 голосов
/ 30 июля 2011

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

0 голосов
/ 30 июля 2011

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

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

...