ListView の DrawItem イベント

ListView.HideSelection = False
にして DrawItem イベントを取得してみると、なんと全ての e.State に ListViewItemStates.Selected が付加されている。
真面目に e.State によって背景色などを変えて描画しているととんでもないことになる。
ちなみに HideSelection が True だと発生しない。

そしてもう一つ、HideSelection とは関係ないが、ListView の根幹のコントロールのバグにより、アイテムをマウスで選択
すると DrawItem イベントが発生してしまうという問題がある。
このとき、e.State は 0 なのに Item.Focused は True、などという不整合がおきている。
DrawItem はスクロールしたときなどにも発生するので、選択もフォーカスも当たってないアイテムの再描画が防げない。


実は、この二つを組み合わせると不具合が解消してしまう。
HideSelection を True にしておくと、スクロール時の DrawItem イベントの e.State は Selected になる。
そして、e.Item.Selected と e.Item.Focused は共に False である。
選択・フォーカスの判断は e.Item.Selected と e.Item.Focused を使い、e.State が 0 のときは再描画を行わないようにする。


if(e.State == 0) return;
if(e.Item.Selected){
    // 選択時の描画処理
    if(e.Item.Focused){
        // フォーカス時の描画処理
    }
}


こうしておくと、マウスオーバーでの再描画が発生しなくなる。
これは、HideSelection のバグ?が無ければ使えない技なので、HideSelection が False だと使えないし、将来的に修正されたら使えなくなる。