C # Listbox Item Двойной щелчок по событию - PullRequest
48 голосов
/ 15 декабря 2010

У меня есть список с некоторыми предметами. Можно ли в любом случае прикрепить событие двойного щелчка к каждому элементу?

Item 1
Item 2
Item 3

Если бы я дважды щелкнул по пункту 2, всплывающее окно с сообщением "Элемент 2"

Как бы я это сделал?

Ответы [ 5 ]

104 голосов
/ 15 декабря 2010
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());
            }
     }

Это должно сработать ... check

28 голосов
/ 15 декабря 2010

WinForms

Добавьте обработчик события для события Control.DoubleClick для вашего ListBox, и в этом обработчике события откройте MessageBox, отображающий выбранный элемент.

например:.

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

Где ListBox1 - это имя вашего ListBox.

Обратите внимание, что вы бы назначили обработчик событий следующим образом:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

1024 * WPF *
Примерно так же, как описано выше, но вместо этого вы бы использовали MouseDoubleClick событие :

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

И обработчик события:

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

Edit: Sisya's answer проверяет, произошел ли двойной щелчок по элементу, который необходимо будет включить в этот код, чтобы устранить проблему, упомянутую в комментариях (MessageBox отображается, если ListBox имеет двойной - щелкнул, когда элемент выбран, но не щелкнул по элементу).

Надеюсь, это поможет!

13 голосов
/ 29 октября 2013

Я знаю, что этот вопрос довольно старый, но я тоже искал решение этой проблемы. Принято решение для WinForms , а не для WPF, которое, я думаю, многие, кто приезжает сюда, ищут.

Для тех, кто ищет решение WPF , есть отличный подход (ответ Оскара здесь ):

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);
    }
}

По сути, вы идете вверх по VisualTree до тех пор, пока не найдете родительский элемент ListBoxItem или не поднимаетесь до фактического ListBox (и поэтому не щелкаете по ListBoxItem).

8 голосов
/ 15 мая 2012

Для 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());
        }
    }

и

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

, что также должно предотвращать срабатывание события, если вы выбираете элемент, а затем нажимаете на пустую область.

0 голосов
/ 25 марта 2018

Это очень старый пост, но если кто-то столкнулся с подобной проблемой и нуждается в быстром ответе:

  • Для захвата при нажатии элемента ListBox используйте событие MouseDown.
  • Для захвата, если элемент щелкается, а не пустое место в списке, отметьте, если listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • Чтобы захватить событие двойного клика, проверьте, если e.Clicks == 2
...