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