Подтвердить что ты не робот

С# Listbox Item Double Click Event

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

Item 1
Item 2
Item 3

Если бы я должен был дважды щелкнуть элемент 2, появится сообщение Message, говорящее "Item 2",

Как мне это сделать?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Это зависит от того, какой у вас объект ListBox класса System.Windows.Forms.ListBox, у которого есть метод ListBox.IndexFromPoint(). Но если объект ListBox принадлежит классу System.Windows.Control.Listbox, ответ от @dark-knight (помеченный как правильный ответ) не работает.

Я использую Win 10 (1903) и текущие версии .NET Framework (4.8). Эта проблема не должна зависеть от версии, только если ваше приложение использует WPF или Windows Form для пользовательского интерфейса. Смотрите также: WPF против Windows Form

Ответ 6

Показываю, что вы используете Visual Studio,

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

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

Ответ 7

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

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