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.