Событие Двойного Щелчка Элемента Списка 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
