2

簡単に言うと、RemoveAt(0) を呼び出したときに ListBox の先頭に戻る自動スクロールを無効にするにはどうすればよいですか?

背景:
一定の間隔で大量のデータをマッシュアップする単純なリスト ボックスがあります。

基本的に私が使用しているのは、ステータス レポート ツールです。

私のプログラムを繰り返すたびに、100行ほどのデータがリストボックスにスローされます。情報の山をダンプする最良の方法は、常に一番下に追加することです。

最新の結果を一番下に、最も古い結果を「押し上げる」ようにします。このリストボックスのサイズは、短時間でかなり大きくなるため、サイズを 1000 アイテムに制限しています。

ボックスが 1000 個を超えるアイテムを取得したら、再び 1000 個のアイテムを取得するまで RemoveAt(0) を使用します。

最も関連性の高い情報を常に表示するために、リストボックスを一番下までスクロールします。これの問題は、RemoveAt(0) を呼び出すたびに、ボックスが新しいアイテム 0 まで自動スクロールされることです。 1000 個のアイテム、次に 1000 個のアイテムを下に移動すると、ぎこちなく見える表示になります。

RemoveAt(0) を呼び出したときに、ListBox の先頭に戻る自動スクロールを無効にするにはどうすればよいですか?

4

2 に答える 2

1

これは、選択されたアイテムがない場合にのみ発生します。つまり、ListBox.SelectedIndex = -1 です。簡単な回避策は、項目を選択することです。最後のように。

于 2011-11-10T16:32:14.380 に答える
0

私はあなたの質問に答えることができません。技術を知っていても、あなたのニーズを満たす答えがないかもしれません。問題の一部は、「これがビジネス上の問題であり、最善の解決策は何か」ではなく、「私が解決しようとしている方法でこれを解決するのを手伝ってください」と尋ねていることです。

私のアドバイス:「リストを1000アイテム以下に保ちながら、新しいイベントで「リスト」を更新する方法が必要」のように聞こえるコア問題に戻ります。これにより、リストボックスのソリューションが下に追加され、ソリューションとして上からクリアされます。また、ソリューションでスクロールをオフにする方法はわかりませんが、それがビジネス上の問題を解決する唯一の方法であるとは確信していません。

分解すると、答えるべきいくつかの質問があります:

  1. データをバインド/更新するにはどうすればよいですか?
  2. バインドされたアイテムの数を変更したときに、コントロールが新しい位置にスクロールしないようにするにはどうすればよいですか?

バインディングに関しては、プログラムによる追加は、下から追加して上を削除するか、上に追加して下を削除するかにかかわらず、1つのオプションです。もう1つは、データをアセンブルして再バインドすることです。他にもあると思います。

スクロールの問題は、「私が見ているものを覚えている」問題や「常に最新のものを表示する」問題ほど、実際にはスクロールの問題ではありません。常に最新のものを表示する場合は、何かが追加または削除されたときに最後にいることを確認する方法を見つける必要があります。ユーザーが位置を変更できる場合は、ユーザーがいる場所を保存してその位置に戻る手段が必要です。リストの長さは1〜1000アイテムになる可能性があるため、複雑さが増しました。パーセンテージで作業しない限り、スクロール位置は常に一番下を除いて危険です。スクロールをオフにすることで当面の問題が解決するかどうかに関係なく、ユーザーの位置を覚えておく必要がある場合は、データが更新された後にチェック手順を実行する必要があります。

最後の提案として、他の人がストリーミングデータの表示の問題をどのように解決したかを見てください。よく知られているパターンに従うことは、ユーザーに使い慣れたインターフェイスを提供するため、良い考えです。多くの場合、ストリーミングデータの場合、ストリームには非常に小さな行のセットがあります(1000ではなく、画面全体に表示されます)が、必要に応じて、前に戻って以前の「ログに記録された」イベントを確認できます。繰り返しになりますが、ソリューションにストリーミングタイプのソリューションが必要かどうかはわかりませんが、それでもコアビジネスの問題に戻ってそこから始める必要があります。

于 2011-11-10T16:14:20.193 に答える