2010-05-03 3 views
0

J'essaie d'afficher un menu contextuel en cliquant avec le bouton droit sur un élément dans une zone de liste. Donc, je lie une liste de "Utilisateurs" à ma liste. Alors je suis un peu perdu. J'ai pensé que je pourrais foreach la liste et ajouter un événement de mouserightdown sur les listboxitems, mais je ne peux pas comprendre comment.Ajouter un événement de clic à une zone de liste remplie d'objets dans le code

Est-ce un bon moyen, ou est-ce que quelqu'un sait un meilleur moyen d'accomplir ce que je veux.

Merci d'avance.

+0

Définissez simplement la propriété ListBox.ContextMenu. Voir http://www.a2zdotnet.com/View.aspx?id=92 –

+0

c'est tout, si facile ... en attendant, j'ai fait un contrôle d'utilisateur, parce que je sais que vous pouvez ajouter un événement, mais ce est juste ce que je avais besoin Pouvez-vous poster cette réponse comme, je veux accepter;) – Terry

Répondre

1

Vous pouvez faire 2 choses qui peuvent résoudre le problème que vous rencontrez:

1) Si vous utilisez usercontrols pour remplir votre listbox, vous pouvez y ajouter des événements click.

2) Si vous ajoutez un menu contextuel à votre listbox, un clic droit sur un élément ouvrira automatiquement le menu contextuel, vous n'avez donc pas besoin d'ajouter un événement click.

0

peut-être vous pouvez obtenir dans l'événement Mousdown de la liste, l'élément est sélectionné. Ou faites-vous le clic droit sans avoir un élément sélectionné?

+0

les événements ne fonctionnent pas en cliquant sur un ListBoxItem, que lorsque u cliquez sur l'espace blanc ... Je veux à droite -cliquez sur un élément de la liste et affichez un menu contextuel. – Terry

0

un moment que je l'ai fait, mais si je me souviens bien:

  • Vous devriez déclencher l'événement sur le droit de la souris vers le bas
  • Figure l'emplacement du curseur à ce moment-
  • Demandez à la liste, quel élément se trouve à ces coordonnées.

La zone de liste a une méthode pour que je pense ...

Edit: ici, ont un code:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button != System.Windows.Forms.MouseButtons.Right) 
      return; 

     int index = listBox1.IndexFromPoint(e.X, e.Y); 

     MessageBox.Show(listBox1.Items[index].ToString()); 

    } 

De toute évidence, vous devez ajouter une vérification d'erreur, si il y a un élément à ce moment-là, etc.

+0

euhm, pourquoi ne pas simplement utiliser MouseRightButtonDown au lieu de vérifier quel bouton est cliqué ...? btw, je travaille dans wpf, et il semble qu'il n'a pas indexfrompoint – Terry

+0

parce que vous ne dites pas que vous utilisez WPF. Peut-être qu'il y a quelque chose de différent. – Werewolve

1

Cela fonctionne:

 private void listBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      Point p = new Point(e.X, e.Y); 
      listBox1.SelectedIndex = listBox1.IndexFromPoint(p); 
      contextMenuStrip1.Show(); 
     } 
    } 

Edit: un peu SRY trop tard;)

+0

Nice, presque le même code: D, sauf que je ne suis pas sûr de savoir comment cela fonctionne dans WPF. –

+0

Dans votre code XAML, vous devez définir l'événement MouseDown ou OrMouseDown. C'est à peu près comme du code non-WPF. –

+0

c'est dynamique, ne peut pas mettre un événement à un listboxitem ou quoi que ce soit, c'est en fonction des éléments, donc le mettre en XAML ne fonctionnera pas – Terry

-1
private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     Point p = new Point(e.X, e.Y); 
     listBox1.SelectedIndex = listBox1.IndexFromPoint(p); 
     contextMenuStrip1.Show(); 
    } 
} 
Questions connexes