C#Listbox项目双击事件

Ozz*_*zzy 48 c# events listbox double-click listboxitem

我有一个包含一些项目的列表框.无论如何我可以在每个项目上附加双击事件吗?

Item 1
Item 2
Item 3
Run Code Online (Sandbox Code Playgroud)

如果我要双击第2项,将弹出一个消息框,说"第2项"

我该怎么办?

Dar*_*ght 105

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());
            }
     }
Run Code Online (Sandbox Code Playgroud)

这应该工作......检查

  • @Milas:我被同样的问题困扰了.确保使用MouseDoubleClick事件(以及MouseEventArgs)和NOT Doubleclick(仅具有EventArgs). (7认同)
  • `e.Location`!?!?!?你确定有这种方法吗?visual studio没有通过ctrl + space建议我这个方法! (5认同)
  • @Jack当用户点击列表框的空白区域时,`SelectedItem`可能不是'null`. (2认同)

Don*_*nut 27

的WinForms

Control.DoubleClick为您的事件添加事件处理程序ListBox,并在该事件处理程序中打开MessageBox显示所选项目的事件.

例如:

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

ListBox1你的名字在哪里ListBox

请注意,您将像这样分配事件处理程序:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);
Run Code Online (Sandbox Code Playgroud)

WPF
几乎与上面相同,但你使用的是MouseDoubleClick事件:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);
Run Code Online (Sandbox Code Playgroud)

和事件处理程序:

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

编辑:Sisya的回答检查是否在项目上发生了双击,这需要合并到此代码中以修复注释中提到的问题(如果在选择项目时双击ListBox,则会显示MessageBox,但是没有点击一个项目).

希望这可以帮助!

  • 嘿,我刚尝试了它确实有效......但是如果我选择一个它然后双击列表框的空白部分,事件仍然会触发并显示消息框,因为该项目仍然被选中,即使我没有加倍点击它......任何想法?:/ (8认同)

msn*_*der 14

我知道这个问题很老了,但我也在寻找解决这个问题的方法.接受的解决方案是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,你走向VisualTree,直到你找到一个ListBoxItem的父项,或者你升到实际的ListBox(因此没有点击ListBoxItem).


小智 9

对于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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

public Form()
{
    InitializeComponent();
    listBox1.MouseDoubleClick += new MouseEventHandler(listBox1_DoubleClick);
}
Run Code Online (Sandbox Code Playgroud)

如果你选择一个项目,那么也应该防止事件发生,然后点击一个空白区域.