2010-12-15 102 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做什麼。

希望這將有助於