2011-07-30 2 views
6

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

Так это то, что я пытаюсь сделать в 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 просто закрывался, если пользователь не закрыл его.

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

RePopulateControls_in_Form1() не попал!

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

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

ответ

10

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

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

0

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

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

+0

OK Я получаю первую часть, но вторая логика не является правильной методикой кодирования! – nawfal

+1

Почему? В приведенном выше случае я бы использовал событие. Однако, если есть значение, которое используется во всем приложении, которое имеет 20 форм и в десять раз больше, чем многие классы, как бы вы гарантировали, что используется только одно значение. Вы предпочли бы передать значение из формы в форму и класс в класс с помощью параметра или свойств конструктора .... – ScruffyDuck

+0

Это просто, как просто установить флаг, чтобы Form1 знал что-то о Form2.Почему глобальная переменная, которая не является потоковой безопасностью? Я понимаю значение общей глобальной переменной, когда вы должны использовать ее в 220 классах, как вы упомянули выше. Но здесь мы не только должны избегать статических переменных, которые спят на протяжении всего жизненного цикла приложения, насколько это возможно, но, что более важно, мне интересно, как бы вы предвидели требование, упомянутое в вопросе, масштабирующееся, чтобы быть чем-то вроде большой, чтобы работать в 220 классах из моего простого вопроса :) – nawfal

2

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

+0

Спасибо. То, что я сделал. – nawfal

+0

Но я чувствую, что @Ryan Russell имеет такой классный звонок. Позвольте мне отметить его – nawfal

Смежные вопросы