13

8 列のユーザー データを入力しているリスト ビューがあります。ユーザーには、自動更新を有効にするオプションがあります。これにより、ListView がクリアされ、データベースから最新のデータが再入力されます。

問題は、アイテムがクリアされて再設定されると、表示領域がリストの一番上に戻ることです。そのため、2000 のアイテム 1000 を見ている場合、そのアイテムに戻るのは非常に不便です。

基本的に、私が求めているのは、現在のスクロール距離 (x と y) を取得して復元するにはどうすればよいですか?

4

9 に答える 9

15

バグのあるListView.TopItemプロパティを必死に使用しようとする人のためにいくつかの情報を提供したかっただけです。

  1. ListView.EndUpdateを呼び出した後、TopItemプロパティを設定する必要があります
  2. ListViewコントロールのアイテムでは、TextプロパティをString.Empty以外に設定する必要があります。そうしないと、プロパティが機能しません。
  3. ListView.TopItemを設定すると、null参照例外が断続的にスローされます。このコード行は常にTry...Catchブロック内に保持してください。

もちろん、これにより、ListViewのスクロールバーが0にジャンプし、一番上のアイテムの場所に戻るので、煩わしいです。この問題の回避策を見つけた場合は、この質問を更新してください。

于 2010-01-24T12:45:05.643 に答える
8

私は以下をうまく使いました:

int topItemIndex = 0;
try
{
     topItemIndex = listView1.TopItem.Index;
}
catch (Exception ex)
{ }
listView1.BeginUpdate();
listView1.Items.Clear();
//CODE TO FILL LISTVIEW GOES HERE
listView1.EndUpdate();
try 
{ 
    listView1.TopItem = listView1.Items[topItemIndex];
}
catch (Exception ex)
{ }
于 2012-10-11T01:10:30.237 に答える
4

少し前に同じ問題があり、モデルとリストを比較するアルゴリズムを実装することになったので、変更された要素のみを追加/削除しました。このように、大規模な変更がなければ、リストは先頭にジャンプしませんでした。そして、私が達成したかった主なことは効率でした(リストが点滅しないように)。

于 2009-03-09T13:58:26.250 に答える
3

ListView の TopItemIndex プロパティは探しているものですが、VS2010 リリースで対処する必要がある確認済みのバグがいくつかあります。不明です (確認していません)。

とにかく、これを機能させるための私の回避策は、これを行うことです:

listViewOutput.TopItemIndex = outputList.Count - 1;
listViewOutput.TopItemIndex = myNewTopItemIndex;

何らかの理由で直接設定しても更新されませんが、最後の項目に設定してから、必要な項目に確実に設定できます。

于 2011-12-06T19:32:51.077 に答える
2

ListView.TopItem プロパティを見てください。リスト内の位置を含むインデックスがあります。新しいリストでそのインデックスを見つけ、TopItem をその項目に設定すると、スクロールが自動的に行われます。

于 2009-03-09T14:05:28.527 に答える
0

スクロール位置を維持するための私の解決策:

フォーム レベル変数:

private static int scrollSpot = 0;

現在のスポットを保存するためのリストビューの更新(つまり、タイマー、ボタン)内:

scrollSpot = this.listView1.TopItem.Index;
refreshTheForm();

保存されたスポットを表示する refreshTheForm メソッド内 (メソッドの最後に配置):

if (scrollSpot <= 1)
{
     listView1.Items[scrollSpot].Selected = true;
}
else
{
     listView1.Items[scrollSpot - 2].Selected = true;
}
listView1.TopItem = listView1.SelectedItems[0]; 
于 2011-11-10T16:55:46.437 に答える
0

私は一種の同じ問題を抱えていました。1/2 秒ごとにデータを入力する listView があり、TopItem をインデックス > 表示項目を持つ ListItem に設定すると、リストは topItem と 2 つのスポットの間でジャンプしました。

したがって、問題を解決するために、EndUpdate の呼び出し後に TopIterm を設定しました。

lvB.EndUpdate();
lvI.EndUpdate();
lvR.EndUpdate();

if (lstEntryInts.Items.Count > 0)
    lstEntryInts.TopItem = lstEntryInts.Items[iTopVisIdx];
if (lstEntryBools.Items.Count > 0)
    lstEntryBools.TopItem = lstEntryBools.Items[iTopVisIdx];
if (lstEntryReals.Items.Count > 0)
    lstEntryReals.TopItem = lstEntryReals.Items[iTopVisIdx];​
于 2010-03-25T19:22:47.817 に答える