Используя событие MouseMove, вы можете отслеживать индекс элемента, над которым находится мышь, и сохранять его в переменной, которая сохраняет свое значение между MouseMoves. Каждый раз, когда MouseMove запускается, он проверяет, изменился ли индекс. Если это так, он отключает всплывающую подсказку, изменяет текст всплывающей подсказки для этого элемента управления, а затем повторно активирует ее.
Ниже приведен пример, в котором одно свойство класса Car отображается в ListBox, но затем отображается полная информация при наведении курсора на любую строку. Чтобы этот пример работал, все, что вам нужно, это ListBox с именем lstCars с событием MouseMove и текстовый компонент ToolTip с именем tt1 в WinForm.
Определение класса автомобиля:
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); } }
}
Событие загрузки формы:
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";
}
Код всплывающей подсказки (включая создание переменной уровня класса с именем 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;
}
}
}