カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2011年05月27日(金)

c# 仮想 ListView で全て選択するには

.NET の ListView で、 VirtualMode を true に設定すると、
ListView を仮想モードで使用することができます。

ListView を仮想モードで使用すると、ListView には
とりあえず表示に必要なアイテムのみ作成されるので、
特に多くのデータを扱う必要のある場合、より高速なレスポンスを
期待することができます。

リストビューを仮想リストビューとして使用するには、
VirtualMode = true にして、 VirtualListSize を設定すると、
RetrieveVirtualItem イベント が、必要に応じて発生するので、
必要とされるアイテムを生成して返せば OK です。

リストビューテスト用フォーム

下がサンプルプログラムです。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace ListViewTest
{
  partial class Form1 : Form
  {
    List items = new List();

    public Form1()
    {
      InitializeComponent();

      listView1.HideSelection = false;
      listView1.VirtualMode = true;
      listView1.View = System.Windows.Forms.View.Details;

      listView1.Columns.Add(new ColumnHeader());
      listView1.Columns[0].Text = "no";

      listView1.RetrieveVirtualItem += listView1_RetrieveVirtualItem;
      buttonInit.Click += buttonInit_Click;
      buttonSelectAll.Click += buttonSelectAll_Click;
    }

    private void listView1_RetrieveVirtualItem(
      object sender, RetrieveVirtualItemEventArgs e
    )
    {
      e.Item = items[e.ItemIndex].CreateListViewItem();
    }

    private void buttonInit_Click(object sender, EventArgs e)
    {
      listView1.BeginUpdate();

      items.Clear();
      for (int i = 0; i < 10000; ++ i)
        items.Add(new VirtualItem(i));
      listView1.VirtualListSize = items.Count;

      listView1.EndUpdate();
    }

    private void buttonSelectAll_Click(object sender, EventArgs e)
    {
      Stopwatch watch = Stopwatch.StartNew();

      listView1.BeginUpdate();

      listView1.SelectedIndices.Clear();
      for (int i = 0; i < items.Count; ++ i)
        listView1.SelectedIndices.Add(i);

      listView1.EndUpdate();

      MessageBox.Show(watch.ElapsedMilliseconds.ToString()); // 236 ミリ秒
    }
  }

  class VirtualItem
  {
    public int no;
    
    public VirtualItem(int no)
    {
      this.no = no;
    }

    public ListViewItem CreateListViewItem()
    {
      ListViewItem item = new ListViewItem(no.ToString());
      return item;
    }
  }
}

Form1() の InitializeComponent() 以降のコードはデザイナーの
プロパティやイベントでも設定できるので、そちらを使用した方が簡単だと思います。

buttonSelectAll_Click では、リストビューの項目を全て選択しています。
仮想モードでは、 SelectedItems が使用できませんが、
SelectedIndices は使用することができるので、
SelectedIndices に全てのインデックスを設定するだけで OK です。

XNA を用いた最新の画像ビューア: ミルノ PC フォトフレーム
ローカルの HTML をカンタンに見られる: ローカルブラウザ
複雑な縁取り文字をカンタンに作成できる: 文字に縁取りするノ


コメント
コメントする