2010-08-08 22 views
5

Estoy tratando de hacer algo al hacer doble clic en un elemento en un ListBox. He encontrado este código para hacer esoManejar eventos de doble clic en elementos ListBox en C#

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

Sin embargo, cuando hago clic en un elemento, el evento no se desencadena. El evento se dispara si hago clic en el ListBox debajo de todos los elementos.

Establecí la propiedad DataSource del ListBox en IList<MyObject>.

¿Alguna idea?

+0

La idea de comprobar e.Clicks == 1 ya se ha mencionado en este hilo. Pero aquí hay otro informe sobre este enfoque: http://cf-bill.blogspot.com/2007/04/c-dragdrop-and-doubleclick.html –

Respuesta

5

Intenté crear un formulario con un ListBox con eventos MouseDown y DoubleClick. Hasta donde puedo ver, la única situación en la que DoubleClick no se activará es si dentro del MouseDown se llama MessageBox.Show (...). En otros casos, funciona bien.

Y una cosa más, no estoy seguro, si es importante, pero de todos modos. Por supuesto, se puede obtener el índice del elemento de la siguiente manera:

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

Pero de esta manera está muy bien así:

if (listBox1.SelectedItem != null) 
    ... 
+0

Esto es lo que hago dentro de mi MouseDown: listBox.DoDragDrop (artículo, DragDropEffects.Copy | DragDropEffects.Move); –

+0

@Hans Espen Veo, también está bloqueando a DoubleClick ... Entonces, puede hacerlo de esta manera: dentro de MouseDown, verifique el número de clics (e.Clicks). Si e.Clicks es igual a 1, llame a DoDragDrop; de lo contrario, realice todas las acciones para DoubleClick. – 26071986

+0

he manejado el evento de doble clic en listbox, pero no puedo depurar el evento, tan pronto como hago doble clic, VS se cuelga antes de ingresar al evento. No pude encontrar lo que está sucediendo. Por favor ayuda –

1

Funciona para mí, así que supongo que puede haber algo sobre los elementos de la lista (¿personalizado? ¿Interceptar el evento?) O el evento no está correctamente cableado.

Por ejemplo probar este (completa 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"); 
     } 
    } 
} 

Con el archivo de origen (diseñador Form1.Designer.cs) que contiene lo siguiente:

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

Como prueba, crear una nueva aplicación base Forms a través de las plantillas, luego agregue solo el ListBox y defina una clase MyObject. Vea si observa el mismo comportamiento o uno diferente.

0

John: entonces funciona. Pero me di cuenta de que el evento no se disparó porque también estoy manejando el evento MouseDown. Traté de eliminar el manejo de MouseDown, y luego funciona. ¿Hay una forma sencilla de manejar ambos eventos? Si no, solo tengo que encontrar otra forma de hacer doble clic en el evento MouseDown.

1

Gracias por todas las respuestas. Ahora funciona Lo resolví, como dijo 26071986, al manejar el doble clic en el manejador MouseDown marcando si e.Clicks es 1. De ser así, llamo a DoDragDrop, si no, llamo al método que maneja doble clic.

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

Esto es lo que utilicé en el evento 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(); 
     ... 
    } 
Cuestiones relacionadas