Событие Двойного Щелчка Элемента Списка C#

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

Item 1
Item 2
Item 3

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

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

6 ответов


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

Это должно работать...проверка


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

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:ответ Сисии проверяет, произошел ли двойной щелчок по элементу, который должен быть включен в этот код, чтобы устранить проблему, упомянутую в комментариях (MessageBox показан, если ListBox дважды щелкнул, когда элемент выбран, но не щелкнул по элементу).

надеюсь, что это помогает!


Я знаю этот вопрос довольно старый, но я искал решение этой проблемы. Принятое решение для приложения 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, или вы поднимаетесь вверх к фактическому списку (и, следовательно, не нажимал ListBoxItem).


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

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


Я покажу вам использование Visual Studio,

Что вы можете сделать для того же resualt, что вы хотите находится в свойствах listBox -> Поведение - >AutoPostBack измените его на "True".

надеюсь, что поможет


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

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