2010-12-15 104 views
40

我有一个列表框与一些项目。无论如何,我可以附加双击事件到每个项目?C#列表框项目双击事件

Item 1 
Item 2 
Item 3 

如果我是双击项目2,一个消息说:“项目2”会弹出

我会怎么做呢?

回答

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

这应该工作...检查

+5

'e.Location'!?!?!? 你确定有这种方法吗? 视觉工作室没有建议我按ctrl +空格这个方法! – 2013-04-28 23:29:07

+7

@Milas:我被同样的问题难倒了。确保你使用的是MouseDoubleClick事件(因此也就是MouseEventArgs),而不是Doubleclick(它只有EventArgs)。 – winwaed 2013-11-06 16:58:25

+0

为什么不使用'SelectedItem'? – Jack 2016-05-07 20:33:52

25

的WinForms

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

例如为:

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
差不多与上面相同,但你会使用MouseDoubleClick event代替:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick); 

而事件处理程序:

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

编辑:Sisya's answer检查,看是否发生了一个项目,这将需要纳入此代码来解决的意见(中提到的问题,显示消息框,如果列表框是双击双击而一个项目被选中,但没有点击一个项目)。

希望这会有所帮助!

+6

Heyy,我只是想它和它的工作......但如果我选择一个ITM然后双击列表框中的空白部分,该事件仍是起火并显示消息框因为该项目仍然选择即使我没有双击它...任何想法? :/ – Ozzy 2010-12-15 20:22:35

+0

我试过这个,不得不使用新的MouseButtonEventHandler(ListBox1_NouseDoubleClick); 它可以在WPF上工作。 – Jiminion 2014-05-27 17:54:08

6

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

也应防止因为如果你选择一个项目,然后事件触发点击一个空白区域。

12

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

为寻找一个WPF解决方案,这里是一个伟大的方式(通过奥斯卡的答案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)。

+0

*** NET中不工作*** *** *** – 2016-11-26 09:56:50

0

我告诉你使用Visual Studio,

你可以为你想要 是在列表框属性 - > 动作 - >的AutoPostBack将其更改为“真”同样resualt做什么。

希望这将有助于