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?
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
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());
}
}
Où 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!
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).
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.
C'est un très vieux message, mais si quelqu'un rencontre un problème similaire et a besoin d'une réponse rapide:
listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
e.Clicks == 2
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