3

WinFormのFormClosingイベントでe.Cancelイベントはどのように機能しますか?Trueクロージングをキャンセルするように設定したことは知っていますが、フォームはどの時点でこれを処理しますか?宿泊施設による二次的な措置はありますか?

カスタムコントロールに同様のアクションを実装するにはどうすればよいですか?(C#またはVB)

注:私は約30分間検索しましたが、GoogleまたはSO検索で回答が見つかりませんでした。したがって、重複している場合は、私の悪い結果です。

4

3 に答える 3

7

Cancel = false元のポスターは、一部のサブスクライバーが設定し、一部のサブスクライバーが設定するとどうなるのか疑問に思っているのではないかと思いますCancel = true。この場合、「フォームはいつこれを処理するのか」という質問がより重要になります。

最初は、セッターが各値のORまたはANDのどちらに実装されているのか疑問に思いました。リフレクターを使用してセッターのショーを検査するCancelEventArgs.Cancelと、プライベートフィールドが設定されます。

public bool Cancel
{
    get{ return this.cancel; }
    set{ this.cancel = value; }
}

したがって、「Form.OnClosing(CancelEventArgs args)」を覗いてみると、前の回答のように値がチェックされたときに表示されると思いましたが、Reflectorが表示するものではありません。

[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void OnClosing(CancelEventArgs e)
{
    CancelEventHandler handler = (CancelEventHandler) base.Events[EVENT_CLOSING];
    if (handler != null)
    {
        handler(this, e);
    }
}

そこで、ソースデバッグを有効にするとEVENT_CLOSING、コレクションからデリゲートを取得するEventsことがウィンドウAPIの奥深くにドロップされ、フォームが設​​定されたときにのhandler最初の行になります。つまり、マネージコードが実際にテストするかどうかはテストされません。EventHandlerList内で何が起こっているのかという醜い内臓が必要な場合は、次のようになります。OnClosingnullCancel = trueCancelEventArgs.Cancel == true

get { 
    ListEntry e = null;
    if (parent == null || parent.CanRaiseEventsInternal) 
    {
        e = Find(key);
    }
    if (e != null) { 
        return e.handler;
    } 
    else { 
        return null;
    } 
}

デバッグ中parent.CanRaiseEventsInternal、クローズがキャンセルされた場合はfalseです。

したがって...フォームの終了をキャンセルする実際の実装は前の回答よりも複雑ですが、独自のイベントをキャンセルする方法に関する彼らの提案は、マネージコードでそれを行う方法を正しく示しています。CancelEventHandlerを呼び出し、CancelEventArgs.Cancelすべてのサブスクライバーが値をに設定する機会を得た後で、の値をテストしますtrueCancel = falseこれは、一部のサブスクライバーが設定し、一部のサブスクライバーが設定した場合に何が起こるかについてはまだ答えていませんCancel = true。誰か知っている?次のようなものが必要ですか?

public bool Cancel
{
   get{ return this.cancel; }
   set{ this.cancel = this.cancel || value; } 
}
于 2009-11-01T14:42:56.667 に答える
2

Windowsフォームで使用される標準のイベント生成パターンに従います。

public event CancelEventHandler MyEvent;

protected void OnMyEvent(CancelEventArgs e) {
  CancelEventHandler handler = MyEvent;
  if (handler != null) {
    handler(this, e);
  }
}

private void button1_Click(object sender, EventArgs e) {
  CancelEventArgs args = new CancelEventArgs();
  OnMyEvent(args);
  if (!args.Cancel) {
    // Client code didn't cancel, do your stuff
    //...
  }
}
于 2009-11-01T13:11:03.033 に答える
0
function OnMyCancelableEvent()
{
   var handler = CancelableEvent;
   var args = new CancelEventArgs()
   if(handler != null)
   {
        handler(this, args)
        if(args.Canceled)
           // do my cancel logic
        else
           // do stuff
   }
}
于 2009-10-31T20:02:34.690 に答える