C# запрос FormClosing

У меня есть форма для запроса некоторых данных. При выходе из поля ввода (TextBox, DGV) вызывается соответствующий метод _Validating или _CellValueChanged.

Если я хочу завершить программу, этот метод также вызывается - до вызова метода _FormClosing.

Как я могу определить, разветвляется ли программа в метод _FormClosing или нет?

private void txb_Validating(object sender, CancelEventArgs e)
{
    doLog("Text 1");
}

private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    doLog("Text 2");
}

private void doLog(string txt)
{
    // this is first called at closing...
    if( [FormClosing is active] )
    {
        // Do something
    }
    else
    {
        // Do someting different
    }
}

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // ... and this but later
    // Write the Logfile
}

Как мне заменить [FormClosing is active], чтобы получить правильный результат?

Я так старалась

if ( this.FormClosing== true ) 

так что

this.FormClosing +=new FormClosingEventHandler(MyForm_FormClosing);

так что

FormClosingEventHandler cl = new FormClosingEventHandler(MyForm_FormClosing);

но я всегда был в тупике.

2 ответа

this.FormClosing это событие, которое запускается, когда ваша форма начинает закрываться (например, нажав кнопку закрытия), отсюда и название. Вам нужно ваше приложение, чтобы зарегистрировать это событие следующим образом:

 this.FormClosing +=new FormClosingEventHandler(MyForm_FormClosing);

Это гарантирует, что после запуска события FormClosing ваш MyForm_FormClosing будет называться.

Вы можете создать флаг как bool bIsFormClosing и установите этот флаг после вызова закрывающей функции.

Редактировать:

Как я теперь понимаю, просмотрев ваш ответ и ваши комментарии, вы хотите узнать в своей функции doLog, закрывается ли форма.

Вот другой подход

`

public class YourForm : Form
{
    private bool bIsClosing = false;
    Private bool bClosingHandled = false;

    public YourClass()
    {
       InitializeComponent();
       this.FormClosing +=
           new FormClosingEventHandler(MyForm_FormClosing);
    }

    private void txb_Validating(object sender, CancelEventArgs e)
    {
        doLog("Text 1");
    }

    private void dgv_CellValueChanged(object sender,
        DataGridViewCellEventArgs e)
    {
        doLog("Text 2");
    }

    private void doLog(string txt)
    {
        // this is first called at closing...
        if( bIsClosing )
        {
            // Do something
            bClosingHandled = true;
            this.close(); 
        }
        else
        {
            // Do someting different
        }
    }

    private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        If(!bClosingHandled)
        {
          bIsClosing = true;
          e.Cancel = true;
          return;
        }

        // Write the Logfile
        doLog("whatever");
    }
}`

Этот подход использует два флага... Когда вы впервые получаете событие закрытия, вы устанавливаете bIsClosing Отметить true, отменить событие и вернуться. Затем, когда вызывается ваша функция dolog, вы запускаете операцию закрытия.

Это бы сработало:

public class YourForm : Form
{
    private bool bIsClosing = false;

    public YourClass()
    {
       InitializeComponent();
       this.FormClosing +=
           new FormClosingEventHandler(MyForm_FormClosing);
    }

    private void txb_Validating(object sender, CancelEventArgs e)
    {
        doLog("Text 1");
    }

    private void dgv_CellValueChanged(object sender,
        DataGridViewCellEventArgs e)
    {
        doLog("Text 2");
    }

    private void doLog(string txt)
    {
        // this is first called at closing...
        if( bIsClosing )
        {
            // Do something
        }
        else
        {
            // Do someting different
        }
    }

    private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        bIsClosing = true;
        // Write the Logfile
        doLog("whatever");
    }
}
Другие вопросы по тегам