2010-02-05 2 views
2

У меня есть обработчик события нажатия кнопки, который говорит this.Close()Новая тема, требуемая для FormClosing?

В событии FormClosing я обнаруживаю несохраненные изменения и говорю «Вы хотите сохранить?».

Если они говорят «Да», я установил e.Cancel = true, а затем вызвал метод «Сохранить». Если данные сохраняются в моем методе сохранения в конце, я говорю это. Закрытие(), но форма остается открытой.

Это кажется такой простой идеей, но я не могу ее решить.

Нужно ли мне создать новую тему в FormClosing так, если они говорят, да установить e.Cancel = истинны и создать новый поток, чтобы сделать Save, который будет затем вызвать this.Close()

+1

Пожалуйста, для любви ко всему, что свято ** НЕ ** называть this.Close() из закрывающего события формы. См. Также: Бесконечная рекурсия. – Powerlord

ответ

2

Если они говорят, что я установил e.Cancel = true, а затем вызвал метод Save. Если данные сохранены в моем методе сохранения в конце, я говорю это. Закрытие(), но форма остается открытой

Измените это.

  • Подскажите пользователь
  • Если они говорят да, установите e.Cancel = !Save()
  • Если они говорят, что нет, установите e.Cancel = true

Это сделает форму, близкую если они не говорят нет, когда будет предложено, или сбой()(). Никаких новых потоков или потоков не требуется, просто небольшое изменение в логике.

+0

На данный момент метод Save не возвращает логическое значение, поэтому мне нужно будет это сделать. Спасибо – Jon

+0

Ну, вы упомянули, что save может потерпеть неудачу - это будет просто вопрос установки e.Cancel == true, если Save не удалось. Однако создание Save() return boolean сделает это простым. –

3

Похоже, что вы хотите сделать, это НЕ установленный e.Cancel к true, а просто позвоните Save() условно от FormClosing. Вы только отмените, если сбой не удался. Например:

private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    if (IsDataModified()) // check if the data is unsaved...however you do so 
    { 
     // display a message asking the user to save changes or abort. 
     if(MessageBox.Show("Do you want to save your changes?", 
         "My Application", 
         MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      if(!SaveChanges();) 
       e.Cancel = true; // save did not succeed! 
     } 
    } 
} 
+0

На данный момент метод Save не возвращает логическое значение, поэтому мне нужно будет это сделать. Спасибо – Jon

+0

@Jon: В зависимости от условий, которые могут привести к успеху/сбою Save, вам также может потребоваться добавить 'try/catch' в вызов' OnFormClosing'. Я бы не использовал исключения в качестве средства управления потоком, но нежелательно, чтобы ваше приложение аварийно завершилось с необработанным исключением, так же как пользователь выходит из него. – LBushkin

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