ListViewコントロールで文字列による ListViewItemの検索・列挙すた2010年08月06日

このエントリーをはてなブックマークに追加
はてなブックマーク - ListViewコントロールで文字列による ListViewItemの検索・列挙

標準で用意されてると思いきやなかった。ぐぐっても気に入ったものひっかからないのでメモ。
C#3.0以上の拡張メソッド。ListViewItemのテキストまたはSubItemsのテキストから一致するものを検索。

static class Extensions
{
    public static ListViewItem[] Find(this ListView listView, string keyWord)
    {
        return FindSubItems(listView, keyWord, 0);
    }

    public static ListViewItem[] FindSubItems(this ListView listView, string keyWord, int index)
    {
        List<ListViewItem> hitItemList = new List<ListViewItem>();
        foreach (ListViewItem item in listView.Items)
            if (item.SubItems[index].Text.Contains(keyWord))
                hitItemList.Add(item);

        return hitItemList.ToArray<ListViewItem>();
    }
}

拡張メソッドの禁じ手とか知らないのだがこれはいいのだろうか。
元から同じ名前のメソッドがある場合は元のほうが優先して呼び出されるようだ。

検索して引っかかった項目だけ表示~っていうのがやりたかっただけ。
というか項目の表示・非表示を切り替えられればいのだが。

一回項目を全て保存しておいて、項目全部消して検索結果の項目追加して~もう一回検索するときは消して追加して・・・っていう流れが適当

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<ListViewItem> itemList = new List<ListViewItem>();

    private void Form1_Load(object sender, EventArgs e)
    {
        itemList.Add(new ListViewItem(new string[] { "1", "灼眼のシャナ"}));
        itemList.Add(new ListViewItem(new string[] { "2", "sola" }));
        itemList.Add(new ListViewItem(new string[] { "2", "灼眼のシャナII" }));
        itemList.Add(new ListViewItem(new string[] { "3", "true tears" }));
        itemList.Add(new ListViewItem(new string[] { "4", "そらのおとしもの" }));
        itemList.Add(new ListViewItem(new string[] { "5", "とらドラ!" }));
        itemList.Add(new ListViewItem(new string[] { "6", "劇場版 灼眼のシャナ" }));

        listView1.Items.AddRange(itemList.ToArray());
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string keyWord = textBox1.Text;

        listView1.Items.Clear();
        listView1.Items.AddRange(itemList.ToArray<ListViewItem>());

        ListViewItem[] hitItem = listView1.FindSubItems(keyWord, 1);
        listView1.Items.Clear();
        listView1.Items.AddRange(hitItem);
    }
}

このエントリーをはてなブックマークに追加
はてなブックマーク - ListViewコントロールで文字列による ListViewItemの検索・列挙

関連する記事

Leave a Reply

Dansette