.NET Windows Forms - прерывание события Close X

Это должно быть немым вопросом, но я не могу понять это. Я также не могу использовать разработчика, потому что кодерам передо мной удалось бросить GUI и логику все в одном, поэтому теперь это перепутано. Я должен сделать это старый школьный путь.

У меня есть Форма, которая может быть закрыта 3 способами: Близкая кнопка, меню File / Close и X значков. Я хочу, чтобы они все сделали то же самое. Прерывание кнопки и событий меню легко. На самом деле оба сцепляются до onCloseConfig метод. Btw, там лучшее название этого метода?

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 были нажаты, не то, что форма закрывается.

7
задан Peter Mortensen 12 May 2010 в 13:19
поделиться

5 ответов

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

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 , но это также избавит от минимального / максимального значения.

12
ответ дан 6 December 2019 в 11:46
поделиться

Это должно остановить закрытие окна: FormClosing(object sender, System.EventArts e) { if (e.CloseReason == CloseReason.UserClosing) e.Cancel = true; }

0
ответ дан 6 December 2019 в 11:46
поделиться

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

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

Или это должно быть this.Close ();

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

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

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

1
ответ дан 6 December 2019 в 11:46
поделиться

Событие FormClosed происходит после закрытия формы. Это определенно не то, чего вы хотите.

Событие FormClosing - это, скорее всего, то, что вам нужно.

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

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

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

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

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

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

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

Если вы хотите реализовать функцию Yes/No/Cancel при закрытии формы, то вам придется пойти следующим путем:

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;
    }
}

Итак, когда пользователь нажмет Yes, ваше приложение сохранит изменения. Когда он нажмет "Нет", приложение ничего не сделает и продолжит закрытие формы. Когда пользователь захочет вернуться в приложение, то закрытие будет предотвращено.

EDIT 1 Обратите внимание на мой ответ на Этот вопрос, который кажется вполне соответствующим тому, чего вы хотите достичь.

1
ответ дан 6 December 2019 в 11:46
поделиться

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

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

3
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: