Introductionnbsp;
ListBox是一个非常普遍的Windows窗体中使用的控制。大多数情况下,我们需要显示在ListBox中每个项目上的一些信息,当用户超过该项目的鼠标指针。可悲的是,有没有直接的方式做到这一点。其理由是:有没有单独的鼠标悬停事件列表中的单个项目。由于列表中的每个项目是不是控制(当然!),我们可以不设置为列表项的工具提示分别。工具提示可以设置只为这样的ListBox。
但是,不要放弃!!如果有意愿,有一种方法吗??/ P>使用代码
所需的步骤说明如下:
拖放到ListBox的形式一个工具提示控制。我呼吁它ListToolTip。
我们要知道在ListBox中每个项目的工具提示文本。我有一个字符串数组ListBox中的项目。所以,我保持在另一个字符串数组的每个项目的工具提示文本。因此,如果我知道索引中的项目的数组项目,我可以得到相应的工具提示文本工具提示使用相同的索引数组。
创建一个ListBox的鼠标移动事件的处理程序。计算鼠标指针放在现在该项目的索引。 (这是最棘手的部分!)
计算列表框的顶部,该项目的偏移量。这可以通过每个项目的高度除以Y坐标的房子位置。每个项目的高度是一个列表框的属性:itemIndex = e.Y / objListBox.ItemHeight;
,但最上面的项目不会永远是列表中的第一项。如果有一个滚动条和用户向下滚动,然后最上面的项目可见会发生变化。这意味着,获得上述的指数是不是所需项目的项目清单中的索引。幸运的是,ListBox中有所谓TopIndex他人财产。如果我们在上述步骤中获得的指数TopIndex,然后我们会得到正确的索引。{C}
现在我们知道鼠标指针放置项目的索引。该项目的工具提示工具提示阵列和它关联的工具提示控制。 if ((itemIndex >= 0) && (itemIndex < m_arrItemToolTips.Length))
{
ListToolTip.SetToolTip(objListBox, m_arrItemToolTips[itemIndex]);
}
如果计算出的索引是有效的索引范围,隐藏工具提示。 else
{
ListToolTip.Hide(objListBox);
}
整个鼠标移动事件处理程序代码如下:
历史2ndnbsp; 2009年1月:战后初期private void ItemsListBox_MouseMove(object sender, MouseEventArgs e)
{
try
{
ListBox objListBox = (ListBox)sender;
int itemIndex = -1;
if (m_arrItemToolTips != null)
{
if (objListBox.ItemHeight != 0)
{
itemIndex = e.Y / objListBox.ItemHeight;
itemIndex += objListBox.TopIndex;
}
if ((itemIndex >= 0) && (itemIndex < m_arrItemToolTips.Length))
{
ListToolTip.SetToolTip(objListBox, m_arrItemToolTips[itemIndex]);
}
else
{
ListToolTip.Hide(objListBox);
}
}
}
catch (Exception ex)
{
}
}