web-dev-qa-db-fra.com

Élément de la zone de liste C #, événement de double-clic

J'ai une liste avec quelques éléments. Est-ce que je peux quand même attacher un événement de double clic à chaque élément?

Item 1
Item 2
Item 3

Si je devais double-cliquer sur l'élément 2, une boîte de message disant "élément 2" apparaîtra

Comment je ferais ça?

46
Ozzy
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());
            }
     }

Cela devrait fonctionner ... check

100
Dark Knight

WinForms

Ajoutez un gestionnaire d'événements pour l'événement Control.DoubleClick à votre ListBox. Dans ce gestionnaire d'événements, ouvrez une MessageBox affichant l'élément sélectionné.

Par exemple.:

 private void ListBox1_DoubleClick(object sender, EventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

ListBox1 est le nom de votre ListBox.

Notez que vous affecteriez le gestionnaire d’événements de la manière suivante:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

WPF
À peu près les mêmes que ci-dessus, mais vous utiliseriez l’événement MouseDoubleClick à la place:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

Et le gestionnaire d'événement:

 private void ListBox1_MouseDoubleClick(object sender, RoutedEventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

Edit: La réponse de Sisya vérifie si le double-clic s'est produit sur un élément, ce qui devrait être incorporé dans ce code pour résoudre le problème mentionné dans les commentaires (MessageBox affiché si ListBox est double-cliqué alors est sélectionné, mais pas cliqué sur un élément).

J'espère que cela t'aides!

28
Donut

Je sais que cette question est assez ancienne, mais je cherchais également une solution à ce problème. La solution acceptée est pour WinForms et non pas pour WPF, ce que beaucoup de ceux qui viennent ici cherchent, je pense. 

Pour ceux qui recherchent une solution WPF, voici une excellente approche (via la réponse ici d'Oskar):

private void myListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject obj = (DependencyObject)e.OriginalSource;

    while (obj != null && obj != myListBox)
    {
        if (obj.GetType() == typeof(ListBoxItem))
        {
             // Do something
             break;
         }
         obj = VisualTreeHelper.GetParent(obj);
    }
}

En gros, vous parcourez le VisualTree jusqu'à ce que vous ayez trouvé un élément parent qui est un ListBoxItem ou que vous montiez au ListBox réel (sans pour autant cliquer sur un ListBoxItem). 

13
msnider

Pour Winforms 

private void listBox1_DoubleClick(object sender, MouseEventArgs e)
    {
        int index = this.listBox1.IndexFromPoint(e.Location);
        if (index != System.Windows.Forms.ListBox.NoMatches)
        {
            MessageBox.Show(listBox1.SelectedItem.ToString());
        }
    }

et 

public Form()
{
    InitializeComponent();
    listBox1.MouseDoubleClick += new MouseEventHandler(listBox1_DoubleClick);
}

cela devrait également empêcher que l'événement ne se déclenche si vous sélectionnez un élément puis cliquez sur une zone vide.

8
Ulti

C'est un très vieux message, mais si quelqu'un rencontre un problème similaire et a besoin d'une réponse rapide:

  • Pour capturer si un élément ListBox est cliqué, utilisez l'événement MouseDown. 
  • Pour capturer si un élément est cliqué plutôt qu'un espace vide dans une zone de liste, vérifiez si listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • Pour capturer un événement en double-clic, vérifiez si e.Clicks == 2
0
Cenk

Je vous montre que vous utilisez Visual Studio,

ce que vous pouvez faire pour le même résultat que vous le souhaitez est dans les propriétés du listBox -> Behavior-> AutoPostBack le changer en "True".

J'espère que ça va aider

0
user8077568