Закрыть форму при ошибке ответа на messagebox

#visual-studio-2010 #visual-c #messagebox #formclosing #dialogresult

#visual-studio-2010 #visual-c #messagebox #закрытие формы #dialogresult

Вопрос:

Я пытаюсь использовать этот код для закрытия формы при определенном ответе в окне сообщения. Я продолжаю получать сообщение об ошибке, в котором говорится, что ни Yes ни No не принадлежат DialogResult:: . Я в основном скопировал этот код прямо с сайта MS, поэтому понятия не имею, что не так. Помочь?

 private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
             if(!watchdog->Checked)
             {
                 if((MessageBox::Show("CAN Watchdog is currently OFF. If you exit with these settings, the SENSOWheel will still be engaged. To prevent this, please enable CAN Watchdog before closing. Would you still like to quit?", "Watchdog Warning", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == DialogResult::No))
                 {
                     return;
                 }
                 else
                 {
                     close_Click(this, e);
                 }
             }

     }
  

Комментарии:

1. Это проблема C , она не хранит отдельные таблицы символов для идентификаторов типов. Вы должны ввести имя полностью, чтобы избежать двусмысленности с Form::DialogResult.

Ответ №1:

if((MessageBox::Показать("...", "Предупреждение сторожевого таймера", MessageBoxButtons::YesNo, MessageBoxIcon::Вопрос) == 
 Система:: Windows:: Forms::DialogResult::Нет)) 
{
 e-> Отмена = true; // не закрывать 
} 

Ответ №2:

Существует конфликт имен между DialogResult перечислением и DialogResult свойством Form . Вам нужно первое, компилятор предполагает, что вы ссылаетесь на второе.

Один из способов устранить неоднозначность — полностью уточнить вашу ссылку на перечисление:

 if((MessageBox::Show("CAN Watchdog ... Would you still like to quit?", "Watchdog Warning", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::No))
  

Я нашел второй метод в этом потоке; переместите using namespace System... инструкции из namespace блока, затем обратитесь к перечислению через глобальное пространство имен.

 if((MessageBox::Show("CAN Watchdog ... Would you still like to quit?", "Watchdog Warning", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == ::DialogResult::No))
  

Ответ №3:

Вот рабочее решение, в котором есть некоторый дополнительный код, чтобы вы могли видеть картину в целом. В этом примере выполняется некоторая работа BackgroundWorker , которую необходимо остановить, прежде чем приложение будет закрыто.

 #pragma region Start/Stop/Exit

    private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
                 if(e->Cancelled)     
                 {
                     rtbLog->Text = rtbLog->Text     ">>> Application stopped n";  
                 }
                 else   
                 {
                     rtbLog->Text = rtbLog->Text     ">>> Application completed n";  
                 }
             }

    private: System::Void startToolStripMenuItemStart_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 if (backgroundWorker1->IsBusy == false) 
                 { 
                     backgroundWorker1->RunWorkerAsync(1);  //starting background worker
                 }
             }

    private: System::Void stopToolStripMenuItemStop_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 if (backgroundWorker1->IsBusy == true amp;amp; backgroundWorker1->WorkerSupportsCancellation == true) 
                 {     
                     backgroundWorker1->CancelAsync(); 
                 } 
             }    

    private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {

                 if((MessageBox::Show("Would you still like to quit?", "Warning", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == 
                     System::Windows::Forms::DialogResult::No))                  
                 {
                     e->Cancel = true;    // Don't close and BackgroundWoker is executing.             
                 }  
                 else
                 {
                     if (backgroundWorker1->IsBusy == true amp;amp; backgroundWorker1->WorkerSupportsCancellation == true) 
                     {     
                         backgroundWorker1->CancelAsync(); 
                     } 
                 } 
             }

    private: System::Void exitToolStripMenuItemExit_Click(System::Object^  sender, System::EventArgs^  e) {

                 Application::Exit(); // The user wants to exit the application. Close everything down.

             }

#pragma endregion