2

我正在使用以下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... ... ...");
                }
            }
        }

问题是,由于在checkedListBox 上频繁移动鼠标,我的应用程序变慢了。

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

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... ... ...");
                }
            }
        }

这里int index正在返回 -1 并且chk.SelectedItem正在返回null

这类问题的解决方案是什么?

4

2 回答 2

5

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

例如。

 Point ptCursor = Cursor.Position; 
 ptCursor = PointToClient(ptCursor); 
 int itemIndex=checkedTextBox1.IndexFromPoint(ptCursor);
 ...
 ...

这对于其他事件也很有用,在这些事件中,您没有在事件参数中指定鼠标位置。

于 2009-10-11T07:05:21.843 回答
1

问题是因为SelectedItem <> checkedItem,selected表示有另一个背景,checked表示左边有check。

代替

 int index = chk.SelectedIndex;

你应该使用:

int itemIndex = checkedListBox1.IndexFromPoint(new Point(e.X, e.Y));
bool selected = checkedListBox1.GetItemChecked(itemIndex );

然后显示你想要的,如果它选择了......

于 2009-10-11T07:02:38.433 回答