ListViewはよく利用される便利なコントロールですが
Itemが数千件、数万件になると、処理が重くなります。
そのため、仮想ListViewとゆー手法が用意されています。
少しコツが必要ですがサンプルを載せます。
考え方としては
見えている範囲だけ描画すればいいじゃない
とゆーことです。
ListViewItemを保持しておいて
描画が求められたら、そのindexのListViewItemを返す、それだけです。
ただ注意点としては
Items、CheckedItems、SelectedItemsプロパティは使用できません。例外となります。
代わりに、選択中アイテムを判断する場合は
SelectedIndicesプロパティーを利用します。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace VirtualListViewSample { public partial class Form1 : Form { // ListViewItem数 const int _size = 1000; // RetrieveVirtualItemで返すもの ListViewItem[] _item = new ListViewItem[_size]; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Column追加 listView1.Columns.Insert(0, "ファイル", 180, HorizontalAlignment.Left); listView1.Columns.Insert(1, "フォルダ", 180, HorizontalAlignment.Left); listView1.Columns.Insert(2, "サイズ", 80, HorizontalAlignment.Right); // 適当にItem追加 for(int index = 0; index < _size; index++) { _item[index] = new ListViewItem( new string[] { "sample_" + index.ToString() + ".txt", @"c:\sample", index.ToString(), } ); } // 表示を詳細に listView1.View = View.Details; // 1行全体選択 listView1.FullRowSelect = true; // // ここから仮想ListView関連 // // 仮想モードON listView1.VirtualMode = true; // Item数設定 listView1.VirtualListSize = _size; // 必須:描画に必要なListViewItemを返すイベント追加 listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem); // ボタンハンドラ button1.Click += new EventHandler(button1_Click); } // // 引数が示すindexのアイテムを返すと描画される // void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { e.Item = _item[e.ItemIndex]; } // ボタンが押されたら選択中アイテムを表示 void button1_Click(object sender, EventArgs e) { if(listView1.SelectedIndices.Count > 0) { int index = listView1.SelectedIndices[0]; MessageBox.Show(_item[index].SubItems[0].Text); } } } }
コメントを残す