我有一个包含一些项目的列表框。无论如何,我可以在每个项目上附加双击事件吗?
Item 1
Item 2
Item 3
如果我要双击第2项,会弹出一个消息框,说“第2项”
我该怎么做?
答案 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());
}
}
ListBox1
是ListBox
的名称。
请注意,您将分配事件处理程序,如下所示:
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)
这是非常古老的帖子,但如果有人遇到类似的问题,需要快速回答:
listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
e.Clicks == 2