Обработка событий двойного щелчка на элементах ListBox в C # - PullRequest
5 голосов
/ 08 августа 2010

Я пытаюсь что-то сделать, дважды щелкнув по элементу в ListBox. Я нашел этот код для этого

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());
            //do your stuff here
        }
    }

Однако, когда я нажимаю на элемент, событие не запускается. Событие запускается, если я нажимаю в ListBox под всеми элементами.

Я установил для свойства DataSource ListBox значение IList<MyObject>.

Есть идеи?

Ответы [ 5 ]

5 голосов
/ 09 августа 2010

Попытка создания формы с помощью ListBox с событиями MouseDown и DoubleClick. Насколько я вижу, единственная ситуация, когда DoubleClick не сработает, это если внутри MouseDown вы вызываете MessageBox.Show (...). В остальных случаях работает нормально.

И еще одна вещь, я точно не знаю, важно ли это, но в любом случае. Конечно, вы можете получить индекс элемента следующим образом:

int index = this.listBox1.IndexFromPoint(e.Location);

Но и этот способ хорош:

if (listBox1.SelectedItem != null)
    ...
1 голос
/ 21 марта 2011

Вот что я использовал в событии MouseDoubleClick.

    private void YourMethodForDoubleClick(object sender, MouseButtonEventArgs e)
    {
        Type sourceType = e.OriginalSource.GetType();
        if (sourceType != typeof(System.Windows.Controls.TextBlock)
            && sourceType != typeof(System.Windows.Controls.Border))
            return;

        //if you get here, it's one of the list items.

        DoStuff();
        ...
    }
1 голос
/ 09 августа 2010

Спасибо за все ответы.Теперь это работает.Я решил это, как сказал 26071986, обработав двойной щелчок в обработчике MouseDown, проверив, равен ли e.Clicks 1. Если это так, я вызываю DoDragDrop, если нет, я вызываю метод, который обрабатывает двойной щелчок.

private void MouseDown_handler(object sender, MouseEventArgs e)
    {
        var listBox = (ListBox) sender;

        if (e.Clicks != 1)
        {
            DoubleClick_handler(listBox1.SelectedItem);
            return;
        }

        var pt = new Point(e.X, e.Y);
        int index = listBox.IndexFromPoint(pt);

        // Starts a drag-and-drop operation with that item.
        if (index >= 0)
        {
            var item = (listBox.Items[index] as MyObject).CommaDelimitedString();
            listBox.DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move);
        }
    }
1 голос
/ 08 августа 2010

Работает для меня, поэтому я предполагаю, что может быть что-то с элементами в списке (нестандартно? Перехватывает событие?), Или событие неправильно подключено.

Например, попробуйте это (заполните Form1.cs):

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
   public class MyObject {
      public MyObject(string someValue) {
         SomeValue = someValue;
      }

      protected string SomeValue { get; set; }

      public override string ToString() {
         return SomeValue;
      }
   }


   public partial class Form1 : Form {
      public Form1() {
         InitializeComponent();

         var list = new List<MyObject> { 
            new MyObject("Item one"), new MyObject("Item two")
         };
         listBox1.DataSource = list;

      }

      private void listBox1_DoubleClick(object sender, EventArgs e) {
         Debug.WriteLine("DoubleClick event fired on ListBox");
      }
   }
}

С исходным файлом конструктора (Form1.Designer.cs), содержащим это:

private void InitializeComponent() {
   this.listBox1 = new System.Windows.Forms.ListBox();
   ... // left out for brevity
   this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick);

В качестве теста создайте новое базовое приложение Forms через шаблоныЗатем добавьте только ListBox и определите класс MyObject.Посмотрите, наблюдаете ли вы то же или другое поведение.

0 голосов
/ 09 августа 2010

Джон: тогда это работает.Но я понял, что событие не сработало, потому что я также обрабатываю событие MouseDown.Я попытался удалить обработку MouseDown, и тогда она работает.Есть ли плавный способ справиться с обоими этими событиями?Если нет, я просто должен найти какой-то другой способ перехватить двойной щелчок через событие MouseDown.

...