2010-08-08 3 views
5

J'essaie de faire quelque chose en double-cliquant sur un élément dans un ListBox. J'ai trouvé ce code pour le faireGestion des événements de double clic sur les éléments ListBox dans C#

void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     int index = this.listBox1.IndexFromPoint(e.Location); 
     if (index != System.Windows.Forms.ListBox.NoMatches) 
     { 
      MessageBox.Show(index.ToString()); 
      //do your stuff here 
     } 
    } 

Cependant, lorsque je clique sur un élément, l'événement n'est pas déclenché. L'événement est déclenché si je clique dans le ListBox ci-dessous tous les éléments. J'ai défini la propriété DataSource du ListBox à IList<MyObject>.

Des idées?

+0

Mais voici un autre article sur cette approche: http://cf-bill.blogspot.com/2007/04/c-dragdrop-and-doubleclick.html –

Répondre

5

J'ai essayé de créer un formulaire avec un ListBox avec des événements MouseDown et DoubleClick. Pour autant que je puisse voir, la seule situation, lorsque DoubleClick ne se déclenchera pas, est si dans le MouseDown vous appelez le MessageBox.Show (...). Dans d'autres cas, cela fonctionne bien.

Et encore une chose, je ne sais pas avec certitude, si c'est important, mais de toute façon. Bien sûr, vous pouvez obtenir l'index de l'élément comme celui-ci:

int index = this.listBox1.IndexFromPoint(e.Location); 

Mais cette façon est bien aussi:

if (listBox1.SelectedItem != null) 
    ... 
+0

Voici ce que je fais dans mon MouseDown: listBox.DoDragDrop (item, DragDropEffects.Copy | DragDropEffects.Move); –

+0

@Hans Espen Je vois, ça bloque aussi DoubleClick ... Donc, vous pouvez le faire de cette façon: dans le MouseDown, vérifiez le nombre de clics (e.Clicks). Si e.Clicks est égal à 1, alors appelez DoDragDrop, sinon effectuez toutes les actions pour DoubleClick. – 26071986

+0

J'ai géré l'événement de double clic sur la liste, mais je ne peux pas déboguer l'événement, dès que je clique deux fois, VS est écrasé avant d'entrer dans l'événement. Je n'ai pas pu trouver ce qui se passe. S'il vous plaît aider –

1

Fonctionne pour moi, donc je suppose qu'il pourrait y avoir quelque chose sur les éléments de la liste (personnalisé? Intercepter l'événement?) Ou l'événement n'est pas correctement câblé.

Par exemple essayer (complet Form1.cs):

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public class MyObject { 
     public MyObject(string someValue) { 
     SomeValue = someValue; 
     } 

     protected string SomeValue { get; set; } 

     public override string ToString() { 
     return SomeValue; 
     } 
    } 


    public partial class Form1 : Form { 
     public Form1() { 
     InitializeComponent(); 

     var list = new List<MyObject> { 
      new MyObject("Item one"), new MyObject("Item two") 
     }; 
     listBox1.DataSource = list; 

     } 

     private void listBox1_DoubleClick(object sender, EventArgs e) { 
     Debug.WriteLine("DoubleClick event fired on ListBox"); 
     } 
    } 
} 

Avec le fichier source de concepteur (Form1.Designer.cs) contenant ceci:

private void InitializeComponent() { 
    this.listBox1 = new System.Windows.Forms.ListBox(); 
    ... // left out for brevity 
    this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick); 

En tant que test, créez un new Forms base l'application à travers les templates, puis ajoute juste le ListBox et définit une classe MyObject. Voyez si vous observez le même comportement ou un comportement différent.

0

John: alors ça marche. Mais j'ai compris que l'événement n'est pas déclenché car je gère également l'événement MouseDown. J'ai essayé d'enlever la gestion de MouseDown, et alors cela fonctionne. Y a-t-il un moyen facile de gérer ces deux événements? Sinon, je dois juste trouver un autre moyen d'attraper un double-clic à travers l'événement MouseDown.

1

Merci pour toutes les réponses. Cela fonctionne maintenant. Je l'ai résolu, comme le dit 26071986, en gérant le double clic dans le gestionnaire MouseDown en vérifiant si e.Clicks est 1. Si c'est le cas, j'appelle DoDragDrop, sinon, j'appelle la méthode qui gère le double clic.

private void MouseDown_handler(object sender, MouseEventArgs e) 
    { 
     var listBox = (ListBox) sender; 

     if (e.Clicks != 1) 
     { 
      DoubleClick_handler(listBox1.SelectedItem); 
      return; 
     } 

     var pt = new Point(e.X, e.Y); 
     int index = listBox.IndexFromPoint(pt); 

     // Starts a drag-and-drop operation with that item. 
     if (index >= 0) 
     { 
      var item = (listBox.Items[index] as MyObject).CommaDelimitedString(); 
      listBox.DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move); 
     } 
    } 
1

Voici ce que j'ai utilisé dans l'événement MouseDoubleClick. L'idée de vérifier e.Clicks == 1 a déjà été mentionnée dans ce fil.

private void YourMethodForDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     Type sourceType = e.OriginalSource.GetType(); 
     if (sourceType != typeof(System.Windows.Controls.TextBlock) 
      && sourceType != typeof(System.Windows.Controls.Border)) 
      return; 

     //if you get here, it's one of the list items. 

     DoStuff(); 
     ... 
    } 
Questions connexes