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が現在オンになっている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... ... ...");
                }
            }
        }

ここで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は左側にチェックがあることを意味します。

それ以外の

 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 に答える