0

いくつかのデータを求めるフォームがあります。入力フィールド (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);

しかし、私はいつも行き止まりでした。

4

2 に答える 2

1

これはトリックを行います:

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");
    }
}
于 2013-02-25T14:48:06.873 に答える
1

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

このアプローチでは 2 つのフラグを使用します。最初に close イベントを受け取ったときに、bIsClosingフラグを true に設定し、イベントをキャンセルして戻ります。次に、dolog 関数が呼び出されたら、クローズ操作を強制します。

于 2013-02-25T14:30:51.717 に答える