1

から継承するカスタムコントロールがありTreeViewます。これでは、ユーザーが期待するように状態を変更する前にCustomTreeViewOnNodeMouseClickイベントを処理して何らかのプロセスを実行します 。node.Checked

public class CustomTreeView : TreeView {
    // Constructor...

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // Do something...

       e.Node.Checked = !e.Node.Checked;
    }
}

私の問題は、開発者がでAfterCheckイベントをサブスクライブするときCustomTreeView、の値e.Actionは常にTreeViewAction.Unknown(ノードのチェックされた状態がコードで変更されるため)ですが、開発者は次のことを待っていTreeViewAction.ByMouseます:

public partial class Form1: Form {
    private void customTreeView1_AfterCheck(object sender, TreeViewEventArgs e) {
        // e.Action == TreeViewAction.Unknown
        // [developer] The user clicked on the node, it should be 
        //             TreeViewAction.ByMouse!?
    }
}

私がやりたいのは、AfterCheckイベントの発生を無効にして、クラスで自分自身を呼び出すことです。そうすれば、に等しいCustomTreeViewパラメーターを渡すことができます。そんな感じ:TreeViewActionByMouse

public class CustomTreeView : TreeView {
    // Constructor...

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // Do something...

       // Prevent all AfterCheck events from firing, just for a moment
       // ??

       e.Node.Checked = !e.Node.Checked;

       // Allow AfterCheck events to fire
       // ??

       // Call myself the AfterCheck event
       base.OnAfterCheck(new TreeViewEventArgs(e.Node, TreeViewAction.ByMouse));
    }
}

これは可能ですか?

4

1 に答える 1

1

確かに、オーバーライドOnAfterCheckするだけでCustomTreeView、意図したとおりに機能します。

public class CustomTreeView : TreeView {

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) {
       base.OnNodeMouseClick(e);

       // your stuff

       // Call myself the AfterCheck event
       base.OnAfterCheck(new TreeViewEventArgs(e.Node, TreeViewAction.ByMouse));
    }

    protected override void OnAfterCheck(TreeViewEventArgs e)
    {
       // do nothing   
    }
}

ここに画像の説明を入力してください

于 2012-08-22T07:37:03.863 に答える