2012-01-20 16 views
0

奇妙な行動のために間違った値を示しますすぐにマウスを上下に動かすと、意図したものの代わりに他のアイテムが選択されています。マウスイベントにgetItemAt(EX、EY)は、C#(VS 2010)のListViewコントロールのマウスクリックイベント(アイテムはチェックボックスなしである)でListViewコントロール

私はデバッグし、e.X、e.YがWRONG値を取り込んでいることを知りました。クリックしてマウスポインタを動かさないと、うまくいきます。しかし、クリックして直ちに別の行に移動すると、その行の1つが選択されます。

質問:

  • これは、リストビューのマウスイベントの既知の問題ですか?
  • マウスイベントの正しい座標を取得する他の方法はありますか?

これはパフォーマンスが非常に重要な企業レベルのプロジェクトです。すべてのマウスイベントは、ダウンし、ダブルクリック、マウスクリックを、itemcheckなどアップ好きのための私たちは、元のコードを書かれている

-Karthik

+5

"非常に緊急"で悲鳴を上げると(どこでもCAPSLOCKを使用するとすぐにダウンボックスが発生します)、 – Nuffin

+0

MouseUpイベントのコードはListViewと相互作用しますか? – Justin

+0

@karthikあなたの質問を編集して、物事を簡単かつ清潔に保ちました。人々は大文字の疑問を読んで緊急を叫ぶのが嫌いです!緊急!私たちは皆、他の人を助けるために私たちの*自由な時間を捧げます。私たちは支払いをしませんので、それを感謝してください。 – oleksii

答えて

2
ListViewItem lvi = m_ListView.FocusedItem; 
(集束)だけでクリックされたアイテム

を取得するために動作するはずです

あなたはあなただけのクリックしたアイテムをしたい場合は、m_ListView.FocusedItemが正常に動作する必要があり、すぐに離してマウスを移動するとき、それは変更理由

m_ListView.GetItemAt(e.X, e.Y); 

は、マウスの位置にあるアイテムを、なるだろう

+0

ありがとうございました。私は今試して、あなたに知らせる – karthik

1

"間違った価値"が何を構成するか考えてみてください。 clickイベントは高レベルイベントであり、コードが実行される瞬間は、その時点でのマウスの位置と必ずしも同じではありません。そのクリック事象の記憶された座標は、ユーザがボタンをクリックした時点のからのものである。マウスを移動し続けると、同じ瞬間にイベント内の座標はマウスの座標と等しくなりません。

すべてのマウスイベントを処理するとします。パフォーマンスのためのものであれば、コントロールのビルドインメカニズムを使用することを検討してください。これらのメカニズムは速度と精度に最適化されています。 10年間の開発で改善するのは難しい(以前の様々なインカネーションによるコントロールは、MSのかなりの開発時間を見せていた)。

最高のスピードが本当に必要な場合は、最初から自分のコントロールを作成してください。利用可能な最良の情報を得るには、低レベルのマウスイベントを使用します。

1

これは仕様によるもので、MouseClickイベントはMouseUpイベントによって生成されています。すべてのクリックイベントはそのように機能します。ボタンを押す、マウスを動かしてボタンを離すと、ボタンを放した場所はいつでもわかります。押した場所ではありません。

代わりにMouseDownイベントを使用する必要があります。

関連する問題