c#checked listbox MouseMove vs MouseHover事件处理程序

use*_*312 2 .net checkedlistbox mousemove winforms mousehover

我使用以下MouseMove事件处理程序将文本文件内容显示为CheckedListBox上的工具提示,并且有一个标记到每个checkedListBoxItem的文本文件对象.

private void checkedListBox1_MouseMove(object sender, MouseEventArgs e)
        {
            int itemIndex = checkedListBox1.IndexFromPoint(new Point(e.X, e.Y));

            if (itemIndex >= 0)
            {
                if (checkedListBox1.Items[itemIndex] != null)
                {
                    TextFile tf = (TextFile)checkedListBox1.Items[itemIndex];

                    string subString = tf.JavaCode.Substring(0, 350);

                    toolTip1.ToolTipTitle = tf.FileInfo.FullName;
                    toolTip1.SetToolTip(checkedListBox1, subString + "\n... ... ...");
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

问题是,我的应用程序因为checkedListBox上频繁的鼠标移动而变慢.

作为替代方案,我想,我应该使用MouseHover事件及其处理程序.但我找不到我的musePointer目前在哪个checkedListBoxItem.像这样:

private void checkedListBox1_MouseHover(object sender, EventArgs e)
        {
            if (sender != null)
            {
                CheckedListBox chk = (CheckedListBox)sender;

                int index = chk.SelectedIndex;

                if (chk != null)
                {
                    TextFile tf = (TextFile)chk.SelectedItem;

                    string subString = tf.FileText.Substring(0, 350);

                    toolTip1.ToolTipTitle = tf.FileInfo.FullName;
                    toolTip1.SetToolTip(checkedListBox1, subString + "\n... ... ...");
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

这int index是返回-1并chk.SelectedItem返回null.

什么可以解决这类问题?

Ash*_*Ash 5

在MouseHover事件中,您可以使用Cursor.Position属性并将其转换为客户端位置并传递给IndexFromPoint()以确定它包含在哪个列表项中.

例如.

 Point ptCursor = Cursor.Position; 
 ptCursor = PointToClient(ptCursor); 
 int itemIndex=checkedTextBox1.IndexFromPoint(ptCursor);
 ...
 ...
Run Code Online (Sandbox Code Playgroud)

这对于其他事件也很有用,在事件参数中没有给出鼠标位置.