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