c # проверенный список MouseMove против обработчика событий 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... ... ...");
                }
            }
        }

Проблема в том, что мое приложение тормозит из-за частых движений мыши в CheckListBox.

В качестве альтернативы, я подумал, я должен использовать событие MouseHover и его обработчик. Но я не смог узнать, на каком CheckListBoxItem сейчас находится мой musePointer. Как это:

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.

Каким может быть решение такого рода проблемы?


person user366312    schedule 11.10.2009    source источник


Ответы (2)


В событии MouseHover вы можете использовать Cursor.Position свойство и преобразовать его в клиентскую позицию и передать в IndexFromPoint(), чтобы определить, содержится ли в каком элементе списка оно содержится.

eg.

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

Это также полезно и для других событий, когда в параметрах события не указано положение мыши.

person Ash    schedule 11.10.2009

Проблема в том, что SelectedItem ‹> checkedItem, выбранный означает, что у него другой фон, отмеченный означает, что флажок установлен слева.

вместо

 int index = chk.SelectedIndex;

вы должны использовать:

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

затем покажите, что вы хотите, если он выбран...

person Wael Dalloul    schedule 11.10.2009
comment
Это работает только в событиях, которые подтверждают параметр события MouseEventArgs. Это не будет работать в MouseHover. - person Ash; 11.10.2009