返回首页

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);

}

整个鼠标移动事件处理程序代码如下:
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)

      {                

      }

}
历史2ndnbsp; 2009年1月:战后初期

回答

评论会员:itsho 时间:2011/12/28
下载页面是空的
评论会员:zwaen 时间:2011/12/28
,这将是很好,知道在何处放置在自己的代码鼠标事件处理程序,对初学者
评论会员:Sheridan1uk 时间:2011/12/28
private void ListBoxes_MouseMove(object sender, MouseEventArgs e)

{

      ListBox listBox = (ListBox)sender;

      int index = listBox.IndexFromPoint(e.Location);

      if (index > -1 && index < listBox.Items.Count)

      {

            string tip = listBox.Items[index].ToString();

            if (tip != lastTip)

            {

                  toolTip.SetToolTip(listBox, tip);

                  lastTip = tip;

            }

      }

}

一个成员变量"lastTip"记得最后显示的工具提示和快速检查,如果当前的提示是不同的,这消除了不断重新显示工具提示/闪烁。这个例子只是显示的项目"的toString()的值,但可以很容易地进行修改,以使用提示阵列,在使用toolTip.SetToolTip的文章(ListBox中,m_arrItemToolTips [指数]);

修改日(星期四),2009年9月3日下午9:30
评论会员:rhennecke 时间:2011/12/28
好极了!我使用了类似的ToolTipListBox,并认为"lastTip"避免了与Windows 7的闪烁
评论会员:。carlfried 时间:2011/12/28
我不知道如果任何人有这个问题,但我的计划是不断刷新的工具提示文本,甚至当鼠标仍,造成很明显的闪烁在工具提示,所以我只是固定它通过检查,看看工具提示改变之前,我将它设置。我敢肯定有一个更优雅的解决方案,但这个工程
评论会员:。lanoucm 时间:2011/12/28
对于那些用VB我发现当我转换使用标准分裂的标志,而不是整数除法

"实话实转换。这一个显示错误的文本在项目中途下来的项目。
的ItemIndex = e.Y / listBox.ItemHeight

"更好的... ...这洗干净了。
的ItemIndex = e.Y \ listBox.ItemHeight
将概述列表中的实际项目更好。
代码的感谢!

克里斯
评论会员:Donsw 时间:2011/12/28
将提供与源代码更好。如果我能看到你的榜样,可能会更好。

欢呼声中,
Donsw
我最近的文章:用C乐观并发#使用了国际奥委会和DI设计模式
评论会员:TrendyTim 时间:2011/12/28
供参考:有一个多更容易和可靠的方法得到的指数(所有者绘制的列表框可以有每个项目不同的高度)列表框本身的方法称为IndexFromPoint考虑一切。这也考虑到如果使用列
评论会员:stixoffire 时间:2011/12/28
哇感谢冷静 - 你都帮我做一些事情,我想这样做,但似乎无法投入时间去完成它。感谢
评论会员:。tamash_ionut 时间:2011/12/28
简单,有效,谢谢。
评论会员:汤普森 时间:2011/12/28
不过,屏幕截图或两个和一个小的演示项目将肯定有所裨益。
的问候,
史蒂芬
评论会员:。Geek13 时间:2011/12/28
对不起史蒂芬!我们用我们的一个大项目实际上..没有时间,使一个小的项目,为了证明这一点。但我肯定会后这个时间允许..