none
ComboBox.MouseDoubleClick no responde... RRS feed

  • Pregunta

  • Hola, estoy queriendo poner codigo en el evento MouseDoubleClick de un comboBox, pero no logro que haga nada. Para probar, ademas de mi comboBox, puse un textBox, y en el evente en cuestion escribia una cadena cualquiera en el textBox, para ver si el evento se disparaba, pero tampoco funciona... Yo se que es una tonteria! pero alguien tiene una idea de que puedo estar haciendo mal? Estoy trabajando con Visual Studio 2005 y C#. Les pongo el codigo de lo que estoy haciendo aunque sinceramente no aporta mucho. Muchas gracias por la ayuda! Saludos!

     

    Code Snippet

    private void comboBox1_MouseDoubleClick(object sender, MouseEventArgs e)

    {

    textBox1.Text += "double click";

    }

     

     

    PD: por ultimo, para el evento click no tengo problema, puedo implementar un doble click a partir de eso calculo, pero igual quiero saber que estoy haciendo mal.

     

    martes, 23 de diciembre de 2008 16:30

Respuestas

  • Yo encontre este codigo y lo adapte a mi sistema espero y te sea de utilidad...

    Dim lastClick As Date = Now

    Private Sub combo_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles combo.MouseClick
            If Now < lastClick.AddMilliseconds(SystemInformation.DoubleClickTime) Then
                'Aqui el codigo de lo que quieres utilizar o abrir ya sea un form o algo...
            End If
            lastClick = Now
        End Sub


    Animo y suerte...!!!!
    martes, 27 de enero de 2009 17:21

Todas las respuestas

  • Lei en el sitio de microsoft que el comboBox (entre otros, como por ejemplo los botones) no responde de la misma manera a los eventos que el resto de los controles. Para poder captar el doble click, lei este codigo de ejemplo que me fue de ayuda y funciona. Utilizando un timer y codificando el evento mouseDown del comboBox. Les dejo el link. Saludos!

     

    http://msdn.microsoft.com/es-es/library/ms171543(VS.80).aspx

     

     

    martes, 23 de diciembre de 2008 19:08
  • Yo encontre este codigo y lo adapte a mi sistema espero y te sea de utilidad...

    Dim lastClick As Date = Now

    Private Sub combo_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles combo.MouseClick
            If Now < lastClick.AddMilliseconds(SystemInformation.DoubleClickTime) Then
                'Aqui el codigo de lo que quieres utilizar o abrir ya sea un form o algo...
            End If
            lastClick = Now
        End Sub


    Animo y suerte...!!!!
    martes, 27 de enero de 2009 17:21
  • Hola! implemente el codigo que me pasaste, y funciona todo bien . Sin embargo, hay una cosa, que si bien no es fundamental, se escapa del control de este codigo. Y el problema es que si un usuario, accidentalmente, hiciera tres clicks rapidos, el tercero cumpliria tambien la condicion del If y se ejecutaria nuevamente el codigo que se espera para un doble click. Como resultado, con 3 clicks tendrias 2 ejecuciones, y en realidad, aunque parezca una tonteria, dependiendo del codigo que se meta ahi adentro, puede ocasionar algun error o consecuencias inesperadas. Corregi esto agregando una variable booleana y quedo de esta forma (yo lo tengo hecho en C# pero es lo mismo)

     

    Code Snippet

    private void comboBox1_MouseClick(object sender, MouseEventArgs e)

    {

    now = DateTime.Now;

     

    if (now < lastClick.AddMilliseconds(SystemInformation.DoubleClickTime) && dobleClick)

    {

    //Aqui el codigo de lo que quieres utilizar o abrir ya sea un form o algo...

     

    //pone la variable en false para que no entre una tercera vez.

    dobleClick = false;

    }

    else

    {

    dobleClick = true;

    }

     

    lastClick = now;

    }

     

     

    Ademas adjunto el codigo que yo habia hecho utilizando un timer y codificando el evento MouseDown del ComboBox, para que se vea que este codigo que vos pasaste es mas reducido.

     

    Code Snippet

    private void comboBoxSubcadenas_MouseDown(object sender, MouseEventArgs e)

    {

    //primero, me interesa asegurarme de que se presiono el boton izquierdo

    if (e.Button.Equals(MouseButtons.Left))

    {

    if (primerClick)

    {

    primerClick = false;

    //Determina el area donde el usuario debe hacer click dos veces

    //para que se considere que es un doble click.

    areaDeDoubleClick = new Rectangle(

    e.X - (SystemInformation.DoubleClickSize.Width / 2),

    e.Y - (SystemInformation.DoubleClickSize.Height / 2),

    SystemInformation.DoubleClickSize.Width,

    SystemInformation.DoubleClickSize.Height);

    Invalidate();

    //Dispara el timer para que comience a contar el tiempo

    //transcurrido entre dos clicks sucesivos.

    doubleClickTimer.Start();

    }

    else

    {

    //Verifica que la posicion del puntero este dentro del area anteriormente definida,

    //y que el periodo de tiempo transcurrido entre los dos clicks

    //sea menor que el tiempo definido por el S.O. para ser considerado doble click.

    if (areaDeDoubleClick.Contains(e.Location) &&

    milisegundos < SystemInformation.DoubleClickTime)

    {

    //se produjo un doble click, detiene el timer y resetea la variable booleana

    //¿Por qué detener el timer aca y resetear la variable booleana,

    //si esto ya se hace en el evento tick del mismo?

    //La explicacion es que si se produjera un tercer click (o cuarto tambien, etc.)

    //antes de que se alcance el tiempo limite, o sea el DoubleClickTime,

    //y la variable booleana primerClick (o como se llame) tuviera todavia el valor false

    //entonces, en el tercer click volveria a pasar por aqui, y haria nuevamente el codigo

    //que deseamos que haga cuando se produce un doble click, para un "triple" click.

    //En cambio, si reseteo la variable booleana primerClick en true, el tercer click va a

    //pasar como si fuera un primer click, y va a empezar la cuenta del timer nuevamente.

    doubleClickTimer.Stop();

    primerClick = true;

    milisegundos = 0;

    //quita el elemento seleccionado cuando se hace doble click.

    if (comboBoxSubcadenas.Items.Count > 0)

    {

    try

    {

    comboBoxSubcadenas.Items.RemoveAt(comboBoxSubcadenas.SelectedIndex);

    }

    catch (ArgumentOutOfRangeException)

    {

    comboBoxSubcadenas.SelectedIndex = 0;

    }

    }

    else

    {

    comboBoxSubcadenas.SelectedText = "";

    }

    }

    }

    }

    }

     

    private void doubleClickTimer_Tick(object sender, EventArgs e)

    {

    milisegundos += doubleClickTimer.Interval;

    //El timer alcanzo el limite de tiempo del doble click.

    if (milisegundos >= SystemInformation.DoubleClickTime)

    {

    doubleClickTimer.Stop();

    //Resetea las variables para poder procesar nuevamente los clicks del mouse.

    primerClick = true;

    milisegundos = 0;

    }

    }

     

     

    Igual, voy a marcar tu respuesta como correcta. Muchas gracias por la molestia! Saludos!
    miércoles, 28 de enero de 2009 16:15
  • Ok ps muchas gracias y la verdad si tienes razon no habia considerado los 3 clicks implementaré la variable booleana para evitar posible caos...
    miércoles, 28 de enero de 2009 16:27