- - PR -
【C#】ListViewへの高速な上段からのItem追加について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-06-26 15:07
いつもお世話になっております。
通常、ListViewコントロールにaddすると下に追加されていきますが、 addするたびに上から追加する方法は無いでしょうか? 自前で下記のような処理で作成したのですが、 画面表示が遅すぎて困っています... (正しく動作するのですが、流れるように描画されて、 ちょっと使い物になりません...) 1.add済のデータを1行づつ下行に移動する処理 2.『1処理』で、1番上が空くので情報を追加する処理 ※100件以上前のデータは削除する仕様です。 ちなみに、下記を試してみて、乗り切れないものかと考えています。 案1:自動ソートを設定して自動で並び替えさせる。 (※必ずしもソートされるようなデータが入力されない場合 には使用できない。) 案2:追加時に、表示更新を止めて、追加後に表示更新を動作するようにする。 (※こんな処理が可能かわからない。 OnPaintなどを完璧にハンドリングする必要がある?) なにかもっと他に良い案は無いものでしょうか? 以上、よろしくお願いします。 | ||||
|
投稿日時: 2006-06-26 15:33
こんにちは。
追加するときに Items.Add メソッドではなく、Items.Insert メソッドを使ってみてはどう でしょうか。 | ||||
|
投稿日時: 2006-06-26 16:01
回答ありがとうございます。
下記のような呼出でかなり早くなりました。 ListView.Items.Insert(0,Item型Obj); ただ若干ちらつき感は残りますが、 OKの域に達した感じはします。 ありがとうございました。 | ||||
|
投稿日時: 2006-06-26 16:15
はじめまして、深山です。
既に使っているかもしれませんが、BeginUpdateメソッド EndUpdateメソッド を使用したらどうでしょう? ちらつきが無くなるかもしれません。 | ||||
|
投稿日時: 2006-06-26 17:29
追加情報、ありがとうございます。
下記のような呼出にしてみましたが、 ちらつき感はあまり変わっていないような感じです。 (なにしろ1件づつの追加ですので...) try { listView.BeginUpdate(); ListView.Items.Insert(0,Item型Obj); } catch(Exception ex) { //例外 } finally { listView.EndUpdate(); } とはいえ、知らないメソッドでしたので勉強になりました。 BeginUpdateがあっても無くても肉眼で見る限り、 同じ動作速度ですが、今後の参考のためにソースに入れておくことにします。 また大量にデータを処理する場合には、有効な手段に感じます。 例えば、『最初の投稿で書いた自前処理』とかに対して... 自前処理で試してみたところ、めちゃくちゃ早くなりました。 でも、Insertする方が早く感じます... やはり自前処理はつくりがまずいようです...!? 何はともあれ勉強になりました、ありがとうございました。 | ||||
|
投稿日時: 2006-06-26 17:36
それはそうでしょうね。 追加作業開始前に 1 度だけ、BeginUpdate メソッドを呼び出す。 ... 数件追加する作業が発生 ... 最後に 1 度だけ、EndUpdate メソッドを呼び出す。 ですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-06-28 12:05
項目追加の間隔が分かりませんが、追加したい項目がいくつもあるなら、1件ずつ Items.Add() するよりも Items.AddRange() する方が高速です。 | ||||
|
投稿日時: 2006-06-28 13:28
いつもお世話になっております。 質問の仕方がまずかったですね。 今回は、下記処理を行なう仕様でした。 ・ListView内の情報は、100行でサイクリック処理を行なう ・ListViewへの追加は、1件づつ ・ListViewへの追加は、上側から行なう ・ListViewへの追加では、画面のちらつきを抑制する。 ということなので、要件的にAddRangeは今回は未使用になります。 そもそも、(InsertでIndex=0を使用すればいいものを、) なぜかAddしか思いつかなかったので、(←きっと疲れていたんでしょうね...) ListView内でAdd時に下側へのシフト処理を自前で書きました。 すると、異常にちらつきが発生するので 『ListViewへの高速な上段からのItem追加について』 をタイトルとしてしまいました。 はじめからInsertしてれば良かっただけなんですよね... とはいえBeginUpdate〜EndUpdateは、勉強になりました。 アドバイス、ありがとうございました。 また質問させて頂いた際には、よろしくお願いします。 |