C#Listbox项目双击事件

时间:2010-12-15 20:14:28

标签: c# events listbox listboxitem double-click

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

Item 1
Item 2
Item 3

如果我要双击第2项,会弹出一个消息框,说“第2项”

我该怎么做?

7 个答案:

答案 0 :(得分:101)

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

这应该有用......检查

答案 1 :(得分:28)

<强>的WinForms

ListBox的{​​{3}}事件添加事件处理程序,并在该事件处理程序中打开显示所选项目的MessageBox

E.g:

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

ListBox1ListBox的名称。

请注意,您将分配事件处理程序,如下所示:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

<强> WPF
与上面几乎相同,但您使用的是Control.DoubleClick

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

事件处理程序:

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

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

希望这有帮助!

答案 2 :(得分:13)

我知道这个问题很老了,但我也在寻找解决这个问题的方法。接受的解决方案是 WinForms 而不是WPF,我想很多来这里的人都在寻找。

对于任何寻找 WPF 解决方案的人来说,这是一个很好的方法(通过Oskar的回答here):

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

答案 3 :(得分:8)

对于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);
}

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

答案 4 :(得分:1)

这取决于您是否具有System.Windows.Forms.ListBox方法的ListBox.IndexFromPoint()类的ListBox对象。但是,如果ListBox对象来自System.Windows.Control.Listbox类,则@ dark-knight的答案(标记为正确答案)不起作用。

我正在运行Win 10(1903)和当前版本的.NET Framework(4.8)。但是,此问题不应该与版本有关,而仅取决于您的应用程序是针对UI使用WPF还是Windows Form。 另请参阅:WPF vs Windows Form

答案 5 :(得分:0)

我告诉你使用Visual Studio,

你可以为你想要的同样的事情做些什么 在列表框属性 - &gt; 行为 - &gt; AutoPostBack将其更改为&#34; True&#34;。

希望有所帮助

答案 6 :(得分:0)

这是非常古老的帖子,但如果有人遇到类似的问题,需要快速回答:

  • 要捕获是否单击了ListBox项,请使用MouseDown事件。
  • 要捕获是否单击某个项目而不是列表框中的空白空间,请检查listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • 要捕获双击事件,请检查e.Clicks == 2