2013-02-01 46 views
12

我有一個複選框的樹形圖,我試圖禁用雙擊只有當這是在複選框中完成。c#treeview忽略雙擊只在複選框

我發現了一種完全禁用雙擊的方法,但它不是我想要的。

我很感謝你能否幫助我。

回答

4

如果你只是想知道一個DoubleClick事件從發生的CheckBox:

private void TreeViewDoubleClick(object sender, EventArgs e) 
{ 
    var localPosition = treeView.PointToClient(Cursor.Position); 
    var hitTestInfo = treeView.HitTest(localPosition); 
    if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     return; 

    // ... Do whatever other processing you want 
} 
+0

它工作得很好,非常感謝您。 –

+0

我知道必須有比我回答的更好的方式,但無法弄清楚。 +1 – TaRDy

+1

我不確定這是否有效。該錯誤似乎實際上阻塞了所有的雙擊事件。如果雙擊一個複選框,則根本不會發生雙擊事件。如果你在任何地方單擊幾次,*然後*雙擊事件觸發,但因爲他們被解僱這麼晚了,他們的事件中就會出現錯誤的信息。 –

9

選項1:完全禁用雙擊事件。
創建用戶控制

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Result = IntPtr.Zero; 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

和你的設計師文件(form.Designer.cs),尋找控制被創造在哪裏,並更換新的控制調用TreeView的構造。

this.treeView1 = new MyTreeView();

選項2:治療雙擊事件爲兩個單點擊事件

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Msg = 0x0201; 
     } 
     base.WndProc(ref m); 
    } 
} 

我個人認爲選擇2更直觀。當用戶單擊複選框兩次時,複選框未被選中。

11

我發現這個問題時,谷歌搜索相同的錯誤。 NoodleFolk的解決方案的問題是,它通過雙擊一個項目禁用擴展三。通過結合NoodleFolk與約翰arlens答案的答案,你會得到這樣的事情:

class NewTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x203) // identified double click 
     { 
      var localPos = PointToClient(Cursor.Position); 
      var hitTestInfo = HitTest(localPos); 
      if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
       m.Result = IntPtr.Zero; 
      else 
       base.WndProc(ref m); 
     } 
     else base.WndProc(ref m); 
    } 
} 

我(快速)測試該解決方案,它似乎工作。

0

綜合以上的答案,我發現這對我來說是最好的解決方案。雙擊節點以展開其子項仍然有效,只有雙擊複選框纔會受到影響和修復:

class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203 && this.CheckBoxes) 
     { 
     var localPos = this.PointToClient(Cursor.Position); 
     var hitTestInfo = this.HitTest(localPos); 
     if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     { 
      m.Msg = 0x0201; 
     } 
     } 
     base.WndProc(ref m); 
    } 
}