2013-02-01 17 views

Odpowiedz

4

Jeśli chcesz tylko wiedzieć zdarzenie DoubleClick wystąpił z pola wyboru:

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

Udało się idealnie. Dziękuję bardzo. –

+0

Wiedziałem, że musi być lepsza droga niż to, z czym ja odpowiedziałem, ale nie mogłem tego rozgryźć. +1 – TaRDy

+1

Nie jestem pewien, czy to działa. Błąd wydaje się właściwie zatykać wszystkie zdarzenia z podwójnym kliknięciem. Jeśli klikniesz dwukrotnie pole wyboru, żadne zdarzenia z podwójnym kliknięciem nie będą się uruchamiać. Jeśli naciśniesz jedno kliknięcie w dowolnym miejscu, * wtedy * zdarzenia z podwójnym kliknięciem będą uruchamiane, ale ponieważ wystrzelili tak późno, otrzymają błędne informacje w swoich zdarzeniach. –

9

Wariant 1: Całkowicie wyłączyć kliknij dwukrotnie zdarzenie.
utworzyć formant klienta

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

aw pliku projektanta (form.Designer.cs) poszukaj gdzie kontrola została stworzona i zastąpić wywołanie konstruktora TreeView z nowego kontrolą.

this.treeView1 = new MyTreeView();

Opcja 2: Potraktowano kliknij dwukrotnie zdarzenie w postaci dwóch pojedynczych zdarzeń kliknięcia

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

Osobiście myślę, że opcja 2 jest bardziej intuicyjne. Gdy użytkownik kliknie dwukrotnie to pole wyboru, pole wyboru nie jest zaznaczone.

11

Znalazłem to pytanie podczas wyszukiwania w Google dla tego samego błędu. Problem z rozwiązaniem NoodleFolk polega na tym, że wyłącza on rozszerzanie trzech poprzez dwukrotne kliknięcie elementu. Łącząc odpowiedź NoodleFolk za Johna Arlens odpowiedź, co można uzyskać coś takiego:

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

I (szybko) testowano tego rozwiązania, a to wydaje się działać.

0

Łącząc powyższe odpowiedzi, uznałem to za najlepsze rozwiązanie dla mnie. Podwójne kliknięcie na węźle, aby rozwinąć swoje dzieci, nadal działa, tylko podwójne kliknięcie pola wyboru ma wpływ i naprawiono:

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); 
    } 
} 
Powiązane problemy