双击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中单击,则会触发该事件。
我将ListBox
的DataSource属性设置为IList<MyObject>
。
有什么想法吗?
答案 0 :(得分:5)
尝试使用包含MouseDown和DoubleClick事件的ListBox创建表单。据我所知,唯一的情况是,当DoubleClick不会触发时,如果在MouseDown中调用MessageBox.Show(...)。在其他情况下,它工作正常。
还有一件事,我不确定,如果它很重要,但无论如何。当然,你可以得到这样的项目索引:
int index = this.listBox1.IndexFromPoint(e.Location);
但这种方式也很好:
if (listBox1.SelectedItem != null)
...
答案 1 :(得分: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基础应用程序,然后只添加ListBox并定义一个类MyObject。看看你是否观察到相同或不同的行为。
答案 2 :(得分:1)
感谢您的回复。它现在有效。我解决了它,就像26071986所说,通过检查e.Clicks是否为1来处理鼠标处理程序中的双击。如果是,我调用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);
}
}
答案 3 :(得分: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();
...
}
答案 4 :(得分:0)