2012-08-22 53 views
1

我有一個繼承自TreeView的自定義控件。在這種CustomTreeView,我處理OnNodeMouseClick事件改變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類中稱爲我自己,這樣我就可以傳遞參數TreeViewAction等於ByMouse。類似的東西:

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

這可能嗎?

回答

1

當然,只是覆蓋OnAfterCheckCustomTreeView,它會像你打算一樣工作。

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 
    } 
} 

enter image description here