デフォルトの ListView にあまりおかしなバグが見つかりました (所有者が描画したものではありません!)。(例を使用して) アイテムが絶えず追加され、ユーザーが選択したアイテムから少し離れたアイテムを見ようとすると(上または下にスクロール)、大きくちらつきます。Timer
ここで何か間違ったことをしていますか?
これを再現するためのコードを次に示します。
- WindowsFormsApplication1 を作成します。
- フォーム
WindowState
を最大化に設定します。 - フォーム timer1 に置き、
Enabled
true に設定します。 フォーム listView1 に置く:
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; this.listView1.View = System.Windows.Forms.View.Details; this.listView1.VirtualMode = true;
列を 1 つ追加します。
イベントを追加
this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
そして最後に
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { e.Item = new ListViewItem(e.ItemIndex.ToString()); } private void timer1_Tick(object sender, EventArgs e) { listView1.VirtualListSize++; }
それを実行して、リストビューのスクロールバーが表示されるまで待ちます(タイマーが十分なアイテムを追加するため)。
リストビューの最初のアイテムの 1 つを (マウスまたはキーで)選択し、スクロールバーまたはマウス ホイールを使用して下にスクロールし、選択したアイテムが現在のビューの外 (上) に移動するようにします。下にスクロールすればするほど、ちらつきが激しくなります!そして、スクロールバーが何をしているのか見てください?!?!?
選択したアイテムを下にスクロールすると、同様の効果が現れます。
質問
どうすれば対処できますか?アイデアは、自動スクロールを停止し、上下に移動して近くのイベントを調査する可能性を備えた、一定の更新ログ ウィンドウを用意することです。しかし、そのケック効果では、それは不可能です!