Закрытие формы с помощью DialogResult - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть Form1, на котором есть кнопка.При нажатии кнопки откроется Form2.

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

Вот код нажатия кнопки Form2:

private void dataBaseSaveButton_Click(object sender, EventArgs e)
    {
        if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
        {
            MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        else
        {
            //This is where I am saving the data to a file using StreamWrriter.

            this.Close();
        }

Так что теперь, когда Form2 закрылся, откроется новый Form2вверх, и т. д. и т. д. (в Form1 есть цикл, который делает это).

Моя проблема ...

В Form2 У меня также есть _FormClosedсобытие, которое выглядит следующим образом:

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?", 
            MessageBoxButtons.YesNo, MessageBoxIcon.Question);

        if (userAnswer == DialogResult.Yes)
            this.Dispose();
    }

Итак, мой вопрос ...

Как мне вызвать нажатие кнопки, чтобы правильно закрыть Form2 БЕЗ вызова_FormClosed событие, сохраняя функциональность форм одинаковыми?

РЕДАКТИРОВАТЬ:

Я знаю, this.Hide(); добьется цели, но мне интересно, есть ли способне скрывать все Form2, так как их может быть много ..

Ответы [ 5 ]

3 голосов
/ 21 декабря 2011

Я думаю, что ваше приложение имеет странное поведение. Обычно, когда пользователь вводит строки данных, это выполняется в какой-то сетке. Но чтобы ответить на ваш вопрос, вы должны удалить обработку события:

private void Button_Click(object sender, EventArgs e)
{
    this.FormClosed -= Form_Closed;
    this.Close();
}

Надеюсь, что это отвечает на ваш вопрос.

1 голос
/ 21 декабря 2011

Просто введите новое свойство публичной формы для хранения логического значения, если форма может быть закрыта или нет:

public boolean CanClose { get; set; }

затем в вашем конструкторе установите это значение на false:

public Form2()
{
   //....
   CanClose = false;
}

После сохранения ваших данных просто установите это свойство на true:

private void dataBaseSaveButton_Click(object sender, EventArgs e)
    {
        if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
        {
            MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        else
        {
            //This is where I am saving the data to a file using StreamWrriter.

            CanClose = true;

            this.Close();
        }

и, наконец, в своем закрытии просто проверьте, можете ли вы закрыть форму молча или вам нужно показать диалог:

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
      if (!CanClose) 
      {
         DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?", 
            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
         if (userAnswer != DialogResult.Yes) 
         {
           e.Cancel = true;
           return;
         }
      }

       this.Dispose();
    }
1 голос
/ 21 декабря 2011

I думаю вам нужно изменить событие закрытия, чтобы определить, нужно ли его отменить или нет:

Исходя из вашего комментария, вам нужно будет установить локальную переменную в качестве флага. Свойство CloseReason в FormClosedEventArgs будет установлено на UserClosing при любом способе закрытия формы (несмотря на то, что сказано в документации).

private bool _ConfirmClosing = true;

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
  if (_ConfirmClosing) {
    DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?", 
        MessageBoxButtons.YesNo, MessageBoxIcon.Question);

    if (userAnswer == DialogResult.No)
      e.Cancel = true;
  }
}
1 голос
/ 21 декабря 2011

Вы не можете избежать вызова FormClosed, но вы можете добавить некоторую логику, чтобы игнорировать его.

например, установите флаг, когда вы принудительно закрываете форму (что-то вроде bool _forceClose), и проверьте этот флагв вашем FormClosed событии.Если он установлен, просто вернитесь и проигнорируйте остальные операторы.

0 голосов
/ 21 декабря 2011

Библиотека Windows.Forms обычно непоследовательна, когда речь идет о событиях, запускаемых или нет, когда действия вызываются программно.

Я бы посоветовал вам оставить участника в своей форме, чтобы узнать, хотите ли вы этого или нетигнорировать событие.

private void dataBaseSaveButton_Click(object sender, EventArgs e)
{
    if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
    {
        MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }

    else
    {
        //This is where I am saving the data to a file using StreamWrriter.
        this.IgnoreCloseEvent = true;

        this.Close();

        this.IgnoreCloseEvent = false;
    }

А потом

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    if (this.IgnoreCloseEvent)
         return

    DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?", 
        MessageBoxButtons.YesNo, MessageBoxIcon.Question);

    if (userAnswer == DialogResult.Yes)
        this.Dispose();
}

Больно делать это постоянно, но для меня это всегда работало лучше, чем пытаться понятьо том, что делала библиотека Windows.Forms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...