【问题标题】:C# Listbox Item Double Click EventC# 列表框项双击事件
【发布时间】:2011-05-26 03:52:45
【问题描述】:

我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?

Item 1
Item 2
Item 3

如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框

我该怎么做?

【问题讨论】:

    标签: c# events listbox listboxitem double-click


    【解决方案1】:
    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());
        }
    }
    

    这应该可以工作...检查

    【讨论】:

    • e.Location!?!?!?你确定有这个方法吗? Visual Studio 没有通过 ctrl+space 向我建议这种方法!
    • @Milas:我被同样的问题难住了。确保您使用的是 MouseDoubleClick 事件(因此也是 MouseEventArgs)而不是 Doubleclick(只有 EventArgs)。
    • 为什么不使用SelectedItem
    • @Jack 当用户点击列表框的空白区域时,SelectedItem可能不是null
    • IndexFromPoint 是什么?
    【解决方案2】:

    WinForms

    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 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 检查是否在某个项目上发生了双击,这需要将其合并到此代码中以解决 cmets 中提到的问题(如果在一个项目时双击 ListBox,则会显示消息框被选中,但未在项目上单击)。

    希望这会有所帮助!

    【讨论】:

    • 嘿,我刚试了一下,它确实有效......但如果我选择一个它然后双击列表框的空白部分,事件仍然会触发并显示消息框,因为该项目即使我没有双击它仍然被选中...有什么想法吗? ://
    • 我试过了,不得不使用 new MouseButtonEventHandler(ListBox1_NouseDoubleClick);让它在 WPF 上工作。
    【解决方案3】:

    我知道这个问题已经很老了,但我也在寻找解决这个问题的方法。公认的解决方案是针对 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)。

    【讨论】:

    • 这似乎是此处为 WPF 提供的最佳解决方案,但我如何才能仅获取单击项目的文本?例如如果我执行 obj.ToString(),我得到“System.Windows.Controls.ListBoxItem: myItem”,我怎么会得到 myItem?我尝试过几种不同的方式来访问它,但我得到的结果与 obj.ToString() 给出的相同。我知道我可以解析字符串 (obj.ToString().Split(' ')[1]),但我想知道是否有更清洁的解决方案。
    【解决方案4】:

    对于 Winform

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

    如果您选择一个项目然后单击空白区域,这也应该防止事件触发。

    【讨论】:

      【解决方案5】:

      这取决于你是否是System.Windows.Forms.ListBox 类的ListBox 对象,它确实有ListBox.IndexFromPoint() 方法。但如果 ListBox 对象来自 System.Windows.Control.Listbox 类,则来自 @dark-knight 的答案(标记为正确答案)不起作用。

      我正在运行 Win 10 (1903) 和当前版本的 .NET 框架 (4.8)。不过,此问题不应该与版本相关,仅取决于您的应用程序是使用 WPF 还是 Windows 窗体作为 UI。 另见:WPF vs Windows Form

      【讨论】:

      • 添加操作系统和当前软件版本。 (来自评论)。
      • 操作系统:Win 10 1903,我不确定这个答案需要哪个软件版本?
      • 我希望现在可以了吗?实际上,我本来希望将此答案添加为对@dark-knight 标记答案的回复,但它没有让我这样做。
      【解决方案6】:

      这是一个很老的帖子,但如果有人遇到类似的问题并需要快速回答:

      • 若要捕获 ListBox 项是否被单击,请使用 MouseDown 事件。
      • 要捕获是否单击了某个项目而不是列表框中的空白区域,请检查listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
      • 捕捉双击事件检查e.Clicks == 2

      【讨论】:

        猜你喜欢
        • 2021-12-17
        • 2010-12-17
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多