Cómo... en .NET

Seleccionar un elemento de un ListBox al mover el ratón

Publicado el 11/Jul/2006
Actualizado el 24/Jul/2006
Autor: Guillermo 'guille' Som

En este ejemplo, que es válido para cualquier versión de .NET, te muestro cómo seleccionar un elemento de un ListBox al mover el ratón, sin necesidad de hacer click. Y como de costumbre, con código para VB como para C#.


Introducción:

El código que te voy a mostrar es válido para cualquier versión de .NET Framework, y por tanto para cualquier versión de Visual Basic y C#.
Lo que se pretende es tener un control ListBox con elementos y que cuando el usuario mueva el ratón en el control, se seleccione el elemento sobre el que está el ratón.

Como los controles ListBox pueden tener elementos ocultos, es decir, que es posible que no se muestren todos, también tendremos en cuenta esos elementos ocultos, por tanto averiguaremos cual es el primer elemento mostrado, valor que podemos averiguar por medio de la propiedad TopIndex del ListBox.

Otro detalle es que el alto de cada elemento puede variar, según el tipo de fuente, etc., ese dato también lo tendremos en cuenta, en este caso usaremos la propiedad ItemHeight que es la que nos indica ese valor.

Para saber en que elemento está el cursor del ratón, lo primero que haremos es averiguar el valor de la posición Y del ratón, ese valor lo conseguimos desde el parámetro de tipo MouseEventArgs que tiene el evento MouseMove del ListBox.

La posición del puntero del ratón dentro del ListBox lo averiguaremos por medio de la suma de la posición Y del ratón, el valor Top del control y el alto de cada elemento:
ratón.Y - ListBox.Top + ListBox.ItemHeight.
Después para saber que elemento es en realidad lo haremos con este otro cálculo:
posiciónPuntero \ ListBox.ItemHeight + ListBox1.TopIndex
En el que usamos el valor anterior, lo dividimos por el alto de cada elemento y le sumamos el TopIndex.

Una vez que sabemos el índice del elemento, lo asignaremos a la propiedad SelectedIndex y ya está todo.

 

Más abajo tienes el código de ejemplo para Visual Basic y para C#.
Recuerda que ese código es válido para cualquier versión de .NET o Visual Studio para .NET, incluso la versión 2005 o posterior.

Para usar ese código, crea un nuevo proyecto de tipo Windows Forms (aplicación de Windows) y en el formulario añade un control ListBox y una etiqueta. Deja los mismos nombres y así podrás probarlo.

 

Espero que te sea de utilidad.

Nos vemos.
Guillermo

P.S. (24/Jul/06)
Horacio N. Hdez., en mis foros, ha enviado el siguiente código (para Visual Basic) que hace lo mismo, pero con menos código:

Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) _
                Handles ListBox1.MouseMove

    Me.ListBox1.SelectedIndex = Me.ListBox1.IndexFromPoint(e.Location)

End Sub

 

Gracias Horacio.

 


Código para Visual Basic.NET (VB.NET)El código para VB .NET (cualquier versión)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    For i As Integer = 1 To 30
        ListBox1.Items.Add("Elemento " & i)
    Next
End Sub

Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) _
                Handles ListBox1.MouseMove
    Dim ih As Integer = ListBox1.ItemHeight
    Dim t As Integer = ListBox1.Top

    Dim p As Integer = e.Y - t + ih
    Dim it As Integer = p \ ih + ListBox1.TopIndex

    If it < ListBox1.Items.Count Then
        ListBox1.SelectedIndex = it
    End If

    ' El contenido del elemento actual
    Label1.Text = "Contenido: " & ListBox1.SelectedItem.ToString
End Sub

 


Código para C Sharp (C#)El código para C# (cualquier versión)

private void Form1_Load(object sender, EventArgs e)
{
    for( int i = 1; i <= 20; i++ )
    {
        listBox1.Items.Add("Elemento " + i);
    }
}

private void listBox1_MouseMove(object sender, MouseEventArgs e)
{
    int ih = listBox1.ItemHeight;
    int t = listBox1.Top;

    int p = e.Y - t + ih;
    int it = p / ih + listBox1.TopIndex;

    if( it < listBox1.Items.Count )
        listBox1.SelectedIndex = it;
    
    // El contenido del elemento actual
    label1.Text = "Contenido: " + listBox1.SelectedItem.ToString();
}

 


Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
 



Ir al índice principal de el Guille