- PR -

【C#】ListViewへの高速な上段からのItem追加について

投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2006-06-26 15:07
いつもお世話になっております。

通常、ListViewコントロールにaddすると下に追加されていきますが、
addするたびに上から追加する方法は無いでしょうか?

自前で下記のような処理で作成したのですが、
画面表示が遅すぎて困っています...
(正しく動作するのですが、流れるように描画されて、
ちょっと使い物になりません...)

1.add済のデータを1行づつ下行に移動する処理
2.『1処理』で、1番上が空くので情報を追加する処理

※100件以上前のデータは削除する仕様です。

ちなみに、下記を試してみて、乗り切れないものかと考えています。

 案1:自動ソートを設定して自動で並び替えさせる。
    (※必ずしもソートされるようなデータが入力されない場合
には使用できない。)

 案2:追加時に、表示更新を止めて、追加後に表示更新を動作するようにする。
    (※こんな処理が可能かわからない。
      OnPaintなどを完璧にハンドリングする必要がある?)

なにかもっと他に良い案は無いものでしょうか?

以上、よろしくお願いします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-06-26 15:33
こんにちは。

追加するときに Items.Add メソッドではなく、Items.Insert メソッドを使ってみてはどう
でしょうか。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2006-06-26 16:01
回答ありがとうございます。

下記のような呼出でかなり早くなりました。

 ListView.Items.Insert(0,Item型Obj);

ただ若干ちらつき感は残りますが、
OKの域に達した感じはします。

ありがとうございました。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-26 16:15
はじめまして、深山です。

既に使っているかもしれませんが、BeginUpdateメソッド
EndUpdateメソッド
を使用したらどうでしょう?

ちらつきが無くなるかもしれません。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2006-06-26 17:29
追加情報、ありがとうございます。

下記のような呼出にしてみましたが、
ちらつき感はあまり変わっていないような感じです。
(なにしろ1件づつの追加ですので...)

try
{
 listView.BeginUpdate();

 ListView.Items.Insert(0,Item型Obj);

}
catch(Exception ex)
{
//例外
}
finally
{
 listView.EndUpdate();
}

とはいえ、知らないメソッドでしたので勉強になりました。
BeginUpdateがあっても無くても肉眼で見る限り、
同じ動作速度ですが、今後の参考のためにソースに入れておくことにします。

また大量にデータを処理する場合には、有効な手段に感じます。
例えば、『最初の投稿で書いた自前処理』とかに対して...
自前処理で試してみたところ、めちゃくちゃ早くなりました。
でも、Insertする方が早く感じます...
やはり自前処理はつくりがまずいようです...!?

何はともあれ勉強になりました、ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-26 17:36
引用:

Makotoさんの書き込み (2006-06-26 17:29) より:

下記のような呼出にしてみましたが、
ちらつき感はあまり変わっていないような感じです。
なにしろ1件づつの追加ですので...


それはそうでしょうね。

追加作業開始前に 1 度だけ、BeginUpdate メソッドを呼び出す。
... 数件追加する作業が発生 ...
最後に 1 度だけ、EndUpdate メソッドを呼び出す。

ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-28 12:05
引用:

通常、ListViewコントロールにaddすると下に追加されていきますが、
addするたびに上から追加する方法は無いでしょうか?



項目追加の間隔が分かりませんが、追加したい項目がいくつもあるなら、1件ずつ Items.Add() するよりも Items.AddRange() する方が高速です。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2006-06-28 13:28

いつもお世話になっております。

質問の仕方がまずかったですね。
今回は、下記処理を行なう仕様でした。

 ・ListView内の情報は、100行でサイクリック処理を行なう
 ・ListViewへの追加は、1件づつ
 ・ListViewへの追加は、上側から行なう
 ・ListViewへの追加では、画面のちらつきを抑制する。

ということなので、要件的にAddRangeは今回は未使用になります。

そもそも、(InsertでIndex=0を使用すればいいものを、)
なぜかAddしか思いつかなかったので、(←きっと疲れていたんでしょうね...)
ListView内でAdd時に下側へのシフト処理を自前で書きました。

すると、異常にちらつきが発生するので
『ListViewへの高速な上段からのItem追加について』
をタイトルとしてしまいました。

はじめからInsertしてれば良かっただけなんですよね...
とはいえBeginUpdate〜EndUpdateは、勉強になりました。

アドバイス、ありがとうございました。
また質問させて頂いた際には、よろしくお願いします。

スキルアップ/キャリアアップ(JOB@IT)