Con el evento MouseMove, puede realizar un seguimiento del índice del elemento sobre el que está el mouse y almacenarlo en una variable que mantiene su valor entre MouseMoves. Cada vez que se activa MouseMove, comprueba si el índice ha cambiado. Si es así, deshabilita la información sobre herramientas, cambia el texto de información sobre herramientas para este control y luego lo vuelve a activar.
A continuación se muestra un ejemplo en el que se muestra una propiedad única de una clase de automóvil en un ListBox, pero luego se muestra información completa al pasar el ratón sobre una fila. Para que este ejemplo funcione, todo lo que necesita es un ListBox llamado lstCars con un evento MouseMove y un componente de texto de información sobre herramientas llamado tt1 en su WinForm.
Definición de la categoría de coches:
class Car
{
// Main properties:
public string Model { get; set; }
public string Make { get; set; }
public int InsuranceGroup { get; set; }
public string OwnerName { get; set; }
// Read only property combining all the other informaiton:
public string Info { get { return string.Format("{0} {1}\nOwner: {2}\nInsurance group: {3}", Make, Model, OwnerName, InsuranceGroup); } }
}
Formulario evento de carga:
private void Form1_Load(object sender, System.EventArgs e)
{
// Set up a list of cars:
List<Car> allCars = new List<Car>();
allCars.Add(new Car { Make = "Toyota", Model = "Yaris", InsuranceGroup = 6, OwnerName = "Joe Bloggs" });
allCars.Add(new Car { Make = "Mercedes", Model = "AMG", InsuranceGroup = 50, OwnerName = "Mr Rich" });
allCars.Add(new Car { Make = "Ford", Model = "Escort", InsuranceGroup = 10, OwnerName = "Fred Normal" });
// Attach the list of cars to the ListBox:
lstCars.DataSource = allCars;
lstCars.DisplayMember = "Model";
}
El código de información sobre herramientas (incluyendo la creación de la variable de nivel de clase llamada hoveredIndex):
// Class variable to keep track of which row is currently selected:
int hoveredIndex = -1;
private void lstCars_MouseMove(object sender, MouseEventArgs e)
{
// See which row is currently under the mouse:
int newHoveredIndex = lstCars.IndexFromPoint(e.Location);
// If the row has changed since last moving the mouse:
if (hoveredIndex != newHoveredIndex)
{
// Change the variable for the next time we move the mouse:
hoveredIndex = newHoveredIndex;
// If over a row showing data (rather than blank space):
if (hoveredIndex > -1)
{
//Set tooltip text for the row now under the mouse:
tt1.Active = false;
tt1.SetToolTip(lstCars, ((Car)lstCars.Items[hoveredIndex]).Info);
tt1.Active = true;
}
}
}
Gracias por la sugerencia de revisión, @reformed. Los revisores lo rechazaron, pero hice ajustes al idioma que encontraste confuso. –