【C#】リストビューの表示をテキストボックスの入力内容でフィルタする

C#

リストビューの表示内容をテキストボックスに入力された文字列でフィルタするサンプルコードです。

準備

最低限、フォーム上にテキストボックス(textBox1)とリストビュー(listView1)の配置が必要です。テキストボックスは、デザイナ上でダブルクリックして、TextChangedイベントハンドラを生成しておきます。

サンプルコード

フィルタ機能はリストビューに直接的な実装はありません。そこで、すべてのリストアイテムを m_AllItems に保持しておき、実際にリストビューに表示するのはテキストボックスに入力された条件に合うもののみとし、フィルタ機能を実現します。

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

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // リストビューに表示する全アイテムのリスト
        private List<ListViewItem> m_AllItems = new List<ListViewItem>();

        public Form1()
        {
            InitializeComponent();

            // リストビューのアイテムを初期化
            InitializeListViewItems();
        }

        private void InitializeListViewItems()
        {
            // ListViewをDetailsビューに設定
            listView1.View = View.Details;

            // 列を追加
            listView1.Columns.Add("Name", -2, HorizontalAlignment.Left);

            // 例として、リストビューにいくつかのアイテムを追加
            m_AllItems.Add(new ListViewItem("Apple"));
            m_AllItems.Add(new ListViewItem("Banana"));
            m_AllItems.Add(new ListViewItem("Cherry"));
            m_AllItems.Add(new ListViewItem("Durian"));

            // 初回表示
            FilterListView(textBox1.Text);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            FilterListView(textBox1.Text); // textBox1の内容が変わるたびにフィルタリング
        }

        // フィルタ機能 ★
        private void FilterListView(string filterText)
        {
            // リストビューのアイテムを全てクリア
            listView1.Items.Clear(); 

            foreach (var item in m_AllItems)
            {
                // 条件にマッチするかチェック
                if (item.Text.Contains(filterText))
                {
                    // 条件にマッチしたアイテムをリストビューに追加
                    listView1.Items.Add(item);
                }
            }
        }
    }
}

実行結果

起動時はすべてのアイテムが表示されます。

たとえばテキストボックスに”e”を入力すると、”e”が含まれている”Apple”と”Cherry”がリストビューに残り、他のアイテムは非表示となります。

タイトルとURLをコピーしました