簡體   English   中英

C# 列表框項雙擊事件

[英]C# Listbox Item Double Click Event

我有一個包含一些項目的列表框。 無論如何我可以為每個項目附加一個雙擊事件嗎?

Item 1
Item 2
Item 3

如果我要雙擊第 2 項,會彈出一個顯示“第 2 項”的消息框

我該怎么做?

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

這應該有效...檢查

窗體

ListBoxControl.DoubleClick事件添加一個事件處理程序,並在該事件處理程序中打開一個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事件

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

和事件處理程序:

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

編輯: Sisya 的回答檢查是否雙擊發生在項目上,這需要合並到此代碼中以解決評論中提到的問題(如果在選擇項目時雙擊 ListBox,則顯示消息框,但是未點擊項目)。

希望這有幫助!

我知道這個問題已經很老了,但我也在尋找這個問題的解決方案。 公認的解決方案是針對WinForms而不是 WPF,我認為很多來這里的人都在尋找。

對於任何尋找WPF解決方案的人來說,這是一個很好的方法(通過 Oskar 的回答在這里):

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)。

對於 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);
}

如果您選擇一個項目然后單擊空白區域,也應該防止事件觸發。

這取決於您是否具有System.Windows.Forms.ListBox類的 ListBox 對象,該類確實具有ListBox.IndexFromPoint()方法。 但是,如果 ListBox 對象來自System.Windows.Control.Listbox類,則來自 @dark-knight(標記為正確答案)的答案不起作用。

我正在運行 Win 10 (1903) 和當前版本的 .NET 框架 (4.8)。 不過,此問題不應與版本有關,僅取決於您的應用程序是否使用 WPF 或 Windows 窗體作為 UI。 另請參閱: WPF 與 Windows 窗體

這是一篇很老的帖子,但如果有人遇到類似的問題並需要快速回答:

  • 要捕獲 ListBox 項是否被單擊,請使用 MouseDown 事件。
  • 要捕獲是否單擊了項目而不是列表框中的空白區域,請檢查listBox1.IndexFromPoint(new Point(eX,eY))>=0
  • 捕獲雙擊事件檢查e.Clicks == 2

該帖子很舊,但對於需要它的人有一個簡單的解決方案

private void listBox1_DoubleClick(object sender, EventArgs e)
{
   if (listBox1.SelectedIndex > -1)
   {
      MessageBox.Show(listBox1.Items[listBox1.SelectedIndex].ToString());
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM