0

メインフォームが1つあり、このメインフォームに次のようなユーザーコントロールを1つ追加しています。

objCustomer = new Customer();
objCustomer.Top = this.Top;
objCustomer.Left = this.Left;
this.BeginInvoke((MethodInvoker)delegate { this.Controls.Add(objCustomer); });

さて、あるイベントでは、このコントロールをアンロードして、他のコントロールをロードする必要があります。

if (objCustomer != null)
{
this.Invoke((MethodInvoker)delegate { this.Controls.Remove(objCustomer); });
this.Invoke((MethodInvoker)delegate { objCustomer.Dispose(); });
}
objEmployee = new Employee();
objEmployee.Top = this.Top;
objEmployee.Left = this.Left;

this.BeginInvoke((MethodInvoker)delegate { this.Controls.Add(objEmployee); });

さて、CustomerDispose関数で、他のシステムからのログオフを要求するルーチンがあります。

protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            Common.Log.LogEvent("Customer", "DisposedCall");
            LogOffServer();

            components.Dispose();

        }
        base.Dispose(disposing);
    }

このDisposeイベントは呼び出していないと思います。

私を助けてください。

ありがとうございました

4

1 に答える 1

1

最後のメソッドがフォーム用であると仮定すると、条件付きブロックが実行されていない場合は、フォームのメソッドが呼び出されるDispose()前に、Winform上のすべてのコントロールが破棄されるためです。Dispose()これは、components != null(すべてcomponentsがすでに破棄されているため)falseであり、条件がfalseと評価されることを意味します。

Winformイベントのライフサイクル

于 2013-02-01T18:31:32.913 に答える