2013-02-17 2 views
0

je ces deux événements Form1:Pourquoi lorsque vous cliquez sur le bouton droit de la souris sur listBox, cela fonctionne partout dans la zone listBox?

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
     { 
      //clear the menu and add custom items 
      contextMenuStrip1.Items.Clear(); 
      contextMenuStrip1.Items.Add(string.Format("Edit - {0}", listBox1.SelectedItem.ToString())); 
     } 

     private void listBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      if (e.Button == System.Windows.Forms.MouseButtons.Right) 
      { 
       int index = listBox1.IndexFromPoint(e.Location); 
       if (index == -1) return; 
       contextMenuStrip1.Show(listBox1,listBox1.PointToClient(System.Windows.Forms.Cursor.Position));     
      } 
     } 

Dans le designer, j'ai un ContextMenuStrip et un contrôle ListBox. Ce que j'ai besoin de faire est quand je clique sur le bouton droit de la souris n'importe où sur la zone de la liste, il ne fera rien. Mais si je clique seulement sur l'élément sélectionné dans le listBox alors le contextMenuStrip montrera. Seulement si la souris au-dessus/sur l'élément sélectionné dans le listBox. Lorsque mon programme est déjà en cours d'exécution, le premier élément est sélectionné, donc j'ai besoin qu'une fois que je cours mon programme si je déplace ma souris au-dessus de l'élément sélectionné et que je clique avec le bouton droit cela fonctionnera. Si je ne suis pas sur l'élément sélectionné, cela ne fonctionnera pas. Je veux dire que si le curseur de la souris est au-dessus de l'élément sélectionné, le clic droit fonctionnera et montrera le contextemenustrip.

Non ifi déplacer la souris sur l'élément sélectionné si je place la souris sur l'élément sélectionné maintenant si je clique sur le bouton droit de la souris, cela fonctionnera.

+0

Maintenant je peux cliquer partout dans le listBox et il montrera le contextmenustrip et ce n'est pas ce dont j'ai besoin. – user2065612

Répondre

1

ListBox.IndexFromPoint() est assez libéral dans ce qu'il accepte. Un emplacement situé au-delà du dernier élément de la liste renverra l'index du dernier élément. Vous pouvez résoudre ce problème en double vérification de la position de l'article retourné contre la position de la souris, comme ceci:

private void listBox1_MouseDown(object sender, MouseEventArgs e) { 
     if (e.Button == MouseButtons.Right) { 
      var idx = listBox1.IndexFromPoint(e.Location); 
      if (idx >= 0 && listBox1.GetItemRectangle(idx).Contains(e.Location)) { 
       listBox1.SelectedIndex = idx; 
       contextMenuStrip1.Show(listBox1, e.Location); 
      } 
     } 
    } 

Prenez note que je ne l'ai pas suivi votre demande pour forcer l'utilisateur à ne cliquez sur l'élément sélectionné. Assez déraisonnable de jeter une action utilisateur comme ça, il est beaucoup plus intuitif de simplement sélectionner l'élément cliqué. Si vous ne voulez pas cela, modifiez l'appel GetItemRectangle() pour utiliser listBox1.SelectedIndex au lieu de idx. Assurez-vous simplement que vous n'avez pas d'ennuis quand il n'y a pas encore d'élément sélectionné.

+0

Hans J'ai changé l'événement en MouseDown et j'ai utilisé votre code. Peut-être forcer l'utilisateur à cliquer sur l'élément sélectionné n'est pas une bonne idée, mais maintenant je peux cliquer sur le bouton droit sur n'importe quel endroit dans la listeBack it dosent bien que le contextemenustrip apparaît dans n'importe quel endroit je clique et chaque fois que je clique sur bouton le show contextmenustrip dans un autre endroit dans la listeBox pas même lieu d'excat où la souris est. – user2065612

+0

Comment cela fonctionne-t-il sur un fichier sur le disque dur lorsque je clique sur un fichier pour voir les propriétés du fichier? J'ai vérifié maintenant. Lorsque je déplace avec la souris sur un fichier spécifique, le fichier est peint avec une couleur bleu clair puis cliquez sur le bouton droit de la souris pour ouvrir un menu du fichier avec quelques propriétés. Je pense que c'est ce que je veux que ce soit dans mon cas aussi. – user2065612

+0

L'idée principale est de laisser l'utilisateur la possibilité de supprimer/supprimer un élément de la liste. – user2065612

Questions connexes