2010-05-10 4 views
7

Это должен быть глупый вопрос, но я не могу понять это. Я также не могу использовать конструктор, потому что кодеры до меня сумели бросить GUI и логику все в одном, так что теперь это смущает. Я должен сделать это по старой школе..NET Windows Forms - перехват события Close X

У меня есть форма, которую можно закрыть тремя способами: кнопка Закрыть, меню Файл/Закрыть и значок X. Я хочу, чтобы все они делали то же самое. Перехватить кнопку и события меню легко. Фактически оба подключены к методу onCloseConfig. Кстати, есть ли лучшее название для этого метода?

private void onCloseConfig(object sender, System.EventArgs e) 
{ 
    if (! m_configControl.Modified) 
    { 
     Application.Exit(); // Or should it be this.Close(); 
    } 
    .... 
    // Else present a dialog, ask if they want to save. 
} 

Таким образом, чтобы перехватить X я пытался: this.FormClosing +=new FormClosingEventHandler(this.onCloseConfig); Я считаю, что это то, что вызывает бесконечный цикл. Я не хочу этого :) FormClosed - еще один вариант, но кажется слишком поздно. Я просто хочу перехватить тот факт, что X был нажат, а не тот факт, что форма закрывается.

ответ

12

Я думаю, что вы хотите закрыть форму, вещь, которую вы можете пропустить, - это проверить причину закрытия и только отменить ее, если она принадлежит пользователю, например.

private void my_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
    e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that. 
    } 
} 

, чтобы скрыть «X» установлен Form.ControlBox = false, но это позволит избавиться от мин/макс, а также.

+0

Прохладный! Есть ли способ скрыть X вообще? –

+0

Не оборачиваясь собственным хроном. – Nate

+1

вы можете избавиться от min max и закрыть, хотя –

0

Это должно остановить окно от закрытия: FormClosing (объект отправителя, System.EventArts е) { , если (e.CloseReason == CloseReason.UserClosing) e.Cancel = TRUE; }

+1

System.EventArts [sic] или EventArgs не имеют члена CloseReason, вам нужна FormClosingEventArgs, как в моем ответе –

1

Btw, есть ли лучшее название для этого метода ?

Закрыть [FormName] может быть лучшим выбором.

Должно быть это.Close();

Да, если все, что вы хотите, это закрыть форму.

Необходимо создать новый обработчик событий для события FormClosing. В качестве параметра используется FormClosingEventArgs, а не EventArgs. В обработчиках кликов кнопки и пункта меню просто сделайте это. Close().

Это вызовет событие, и вы сможете разместить все свои чеки там.

3

Создать отдельный метод для кнопки/меню рядом:

private void myButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myMenuButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (m_configControl.Modified) 
    { 
     var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel); 
     if(result == DialogResult.Yes) 
      //Save here 
     else if(result == DialogResult.Cancel) 
      e.Cancel = true; 
    } 
} 

Или, вы можете отключить крупный кнопку («X») в целом, установив this.ControlBox = false

+0

+1 Для создания отдельного метода и объяснения ответа. знак равно –

1

FormClosed event происходит один раз в виде закрыто. Это определенно не то, что вы хотите.

FormClosing event более вероятно, что вам нужно.

Событие FormClosing запускается при нажатии любой кнопки или ссылки на меню. Все, что пытается закрыть форму, вызовет событие FormClosing.

Теперь, более подходящий способ использовать FormClosingEventArgs будет следующим в пределах вашего FormClosing метода обработчика событий:

if(m_configControl.Modified) 
    e.Cancel = true; 

так, если контроль конфигурации не изменяется, то форма будет держать закрытие. Вы хотите, чтобы он не закрывался, только если есть изменения или несохраненные изменения.

EDIT 2 После перечитывал ваш вопрос, смотрите ниже мои изменений в верхний код:

if(m_configControl.Modified) 
    if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected") 
     SaveChanges(); 

Это будет запрашивать у пользователя несохраненных изменений и сохранить только тогда, когда пользователь нажимает кнопку OK в MessageBox. Обратите внимание, что вам придется добавить соответствующие кнопки в дополнительные параметры метода MessageBox.Show().

Если вы хотите достичь в Да/Нет/Отмена на FormClosing, то вам придется пройти этот путь:

if(m_configControl.Modified) { 
    DialogResult dr = MessageBox.Show(...); 
    switch(dr) { 
     case DialogResult.OK: 
      SaveChanges(); 
      break; 
     case DialogResult.No: 
      // Do nothing... 
      break; 
     case DialogResult.Cancel: 
      e.Cancel = true; 
    } 
} 

Таким образом, когда пользователь нажимает кнопку Да, ваше приложение будет сохранить изменения. Когда он нажимает «Нет», приложение ничего не сделает и продолжит свое закрытие. Когда пользователь захочет вернуться к приложению, будет закрыт «Закрыть».

EDIT 1 Взгляните на мой ответ This Question, который кажется совершенно то, чего вы хотите достичь.

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