C# Listbox Item Double Click Event

后端 未结 6 751
天命终不由人
天命终不由人 2020-12-08 06:00

I have a list box with some items. Is there anyway I can attach a double click event to each item?

Item 1
Item 2
Item 3

If i was to double

相关标签:
6条回答
  • 2020-12-08 06:41

    I know this question is quite old, but I was looking for a solution to this problem too. The accepted solution is for WinForms not WPF which I think many who come here are looking for.

    For anyone looking for a WPF solution, here is a great approach (via Oskar's answer 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);
        }
    }
    

    Basically, you walk up the VisualTree until you've either found a parent item that is a ListBoxItem, or you ascend up to the actual ListBox (and therefore did not click a ListBoxItem).

    0 讨论(0)
  • 2020-12-08 06:42

    WinForms

    Add an event handler for the Control.DoubleClick event for your ListBox, and in that event handler open up a MessageBox displaying the selected item.

    E.g.:

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

    Where ListBox1 is the name of your ListBox.

    Note that you would assign the event handler like this:

    ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);
    

    WPF
    Pretty much the same as above, but you'd use the MouseDoubleClick event instead:

    ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);
    

    And the event handler:

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

    Edit: Sisya's answer checks to see if the double-click occurred over an item, which would need to be incorporated into this code to fix the issue mentioned in the comments (MessageBox shown if ListBox is double-clicked while an item is selected, but not clicked over an item).

    Hope this helps!

    0 讨论(0)
  • 2020-12-08 06:47
    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());
                }
         }
    

    This should work...check

    0 讨论(0)
  • 2020-12-08 06:49

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

    and

    public Form()
    {
        InitializeComponent();
        listBox1.MouseDoubleClick += new MouseEventHandler(listBox1_DoubleClick);
    }
    

    that should also, prevent for the event firing if you select an item then click on a blank area.

    0 讨论(0)
  • 2020-12-08 06:49

    This is very old post but if anyone ran into similar problem and need quick answer:

    • To capture if a ListBox item is clicked use MouseDown event.
    • To capture if an item is clicked rather than empty space in list box check if listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
    • To capture doubleclick event check if e.Clicks == 2
    0 讨论(0)
  • 2020-12-08 06:55

    It depends whether you ListBox object of the System.Windows.Forms.ListBox class, which does have the ListBox.IndexFromPoint() method. But if the ListBox object is from the System.Windows.Control.Listbox class, the answer from @dark-knight (marked as correct answer) does not work.

    Im running Win 10 (1903) and current versions of the .NET framework (4.8). This issue should not be version dependant though, only whether your Application is using WPF or Windows Form for the UI. See also: WPF vs Windows Form

    0 讨论(0)
提交回复
热议问题