2013-02-01 11 views
12

ho una vista ad albero con casella di controllo, sto cercando di disabilitare il doppio click solo quando questo è fatto nella casella di controllo.C# treeview ignorare doppio click solo alla casella

Ho trovato un modo per disattivare completamente il doppio click, ma non era quello che volevo.

Apprezzo se puoi aiutarmi.

risposta

4

Se si vuole solo conoscere un evento DoubleClick si è verificato dalla casella di controllo:

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

Ha funzionato perfettamente. Grazie mille. –

+0

Sapevo che ci doveva essere un modo migliore di quello con cui ho risposto, ma non riuscivo a capirlo. +1 – TaRDy

+1

Non sono sicuro che funzioni. Il bug sembra in realtà intasare tutti gli eventi di doppio clic. Se fai doppio clic su una casella di controllo, nessun evento di doppio clic viene attivato. Se fai clic su un singolo clic praticamente ovunque, * poi * gli eventi di doppio clic si attivano, ma poiché sono stati attivati ​​così tardi, finiscono con informazioni errate nei loro eventarg. –

9

Opzione 1: Completamente disabilitare il doppio evento click.
creare un controllo cliente

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

e nel vostro file di progettazione (form.Designer.cs), cercare dove è stato creato il controllo, e sostituire la chiamata al costruttore TreeView con il nuovo controllo.

this.treeView1 = new MyTreeView();

Opzione 2: Trattare un doppio evento click come due eventi click singoli

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

Personalmente credo che l'opzione 2 è più intuitivo. Quando l'utente fa clic due volte sulla casella di controllo, la casella di controllo non è selezionata.

11

Ho trovato questa domanda quando ho cercato su Google lo stesso bug. Il problema con la soluzione di NoodleFolk è che disabilita l'espansione dei tre facendo doppio clic su un elemento. Combinando la risposta di NoodleFolk con John Arlens risposta, si otterrebbe qualcosa di simile:

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 (velocemente) provato questa soluzione, e sembra funzionare.

0

Combinando le risposte sopra, ho trovato che questa fosse la soluzione migliore per me. Fare doppio clic su un nodo per espandere i suoi figli funziona ancora, solo doppio clic su una casella di controllo è interessato e corretto:

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