2010-08-08 64 views
5

我想在双击列表框中的某个项目时执行某些操作。我发现这样做的代码在C#中的ListBox项目上处理双击事件

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()); 
      //do your stuff here 
     } 
    } 

但是,当我点击一个项目,事件不会被解雇。如果我点击所有项目下方的列表框,该事件将被解雇。

我将ListBox的DataSource属性设置为IList<MyObject>

任何想法?

+0

有关检查e.Clicks == 1的想法已经在此线程中提及。但这里有另一个关于这种方法的写法:http://cf-bill.blogspot.com/2007/04/c-dragdrop-and-doubleclick.html – 2011-09-03 01:18:44

回答

5

尝试使用带有MouseDown和DoubleClick事件的ListBox创建表单。据我所知,DoubleClick不会触发的唯一情况是,如果在MouseDown内调用MessageBox.Show(...)。在其他情况下,它工作正常。

还有一件事,我不确定,如果它很重要,但无论如何。当然,你可以得到该项目的这样的指标:

int index = this.listBox1.IndexFromPoint(e.Location); 

但这种方式是罚款,以及:

if (listBox1.SelectedItem != null) 
    ... 
+0

这就是我在我的MouseDown里面做的: listBox.DoDragDrop (item,DragDropEffects.Copy | DragDropEffects.Move); – 2010-08-09 06:51:58

+0

@Hans Espen我看到了,它也阻止了DoubleClick以及... 因此,您可以这样做:在MouseDown中检查点击次数(e.Clicks)。如果e.Clicks等于1,则调用DoDragDrop,否则执行DoubleClick的所有操作。 – 26071986 2010-08-09 07:20:22

+0

我已经处理了列表框上的双击事件,但我无法调试事件,只要我双击,VS在进入事件之前就已经崩溃了。我无法找到正在发生的事情。请帮忙 – 2017-11-20 05:52:53

1

适用于我,所以我认为可能有一些关于列表中的项目(自定义?拦截事件?)或事件未正确连线。

例如尝试此(完整Form1.cs中):

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public class MyObject { 
     public MyObject(string someValue) { 
     SomeValue = someValue; 
     } 

     protected string SomeValue { get; set; } 

     public override string ToString() { 
     return SomeValue; 
     } 
    } 


    public partial class Form1 : Form { 
     public Form1() { 
     InitializeComponent(); 

     var list = new List<MyObject> { 
      new MyObject("Item one"), new MyObject("Item two") 
     }; 
     listBox1.DataSource = list; 

     } 

     private void listBox1_DoubleClick(object sender, EventArgs e) { 
     Debug.WriteLine("DoubleClick event fired on ListBox"); 
     } 
    } 
} 

随着设计者源文件(Form1.Designer.cs)含有这样的:

private void InitializeComponent() { 
    this.listBox1 = new System.Windows.Forms.ListBox(); 
    ... // left out for brevity 
    this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick); 

作为测试,创建一个通过模板添加新的Forms base应用程序,然后添加ListBox并定义一个MyObject类。看看你是否观察到相同或不同的行为。

0

约翰:那么它的工作。但我发现事件并未被解雇,因为我也在处理MouseDown事件。我试图删除MouseDown处理,然后它工作。是否有平稳的方式来处理这两个事件?如果没有,我只能找到其他方法来捕捉通过MouseDown事件的双击。

1

感谢您的所有答复。现在起作用了。我解决了它,就像26071986说的那样,通过检查e.Clicks是否为1来处理MouseDown处理程序中的双击。如果是这样,我调用DoDragDrop,如果没有,我调用处理双击的方法。

private void MouseDown_handler(object sender, MouseEventArgs e) 
    { 
     var listBox = (ListBox) sender; 

     if (e.Clicks != 1) 
     { 
      DoubleClick_handler(listBox1.SelectedItem); 
      return; 
     } 

     var pt = new Point(e.X, e.Y); 
     int index = listBox.IndexFromPoint(pt); 

     // Starts a drag-and-drop operation with that item. 
     if (index >= 0) 
     { 
      var item = (listBox.Items[index] as MyObject).CommaDelimitedString(); 
      listBox.DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move); 
     } 
    } 
1

这是我在MouseDoubleClick事件中使用的。

private void YourMethodForDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     Type sourceType = e.OriginalSource.GetType(); 
     if (sourceType != typeof(System.Windows.Controls.TextBlock) 
      && sourceType != typeof(System.Windows.Controls.Border)) 
      return; 

     //if you get here, it's one of the list items. 

     DoStuff(); 
     ... 
    }