朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
.Net コンボボックスで絞り込み検索する





コンボボックスで入力した文字列にマッチするデータを絞り込み検索したい時のサンプルです。
特徴は、KeyDownイベントで入力された値によって、DataViewクラスのRowFilterでフィルタリングするのですが、この仕組を使いたいのでコンボボックスのデータソースはDataViewにしています。
ここで注意が必要なのはRowFilterでの構文です。
文字列での部分一致で絞込をするためにLIKE演算子で、ワイルドカードの*で前後を挟みます。
ここで一点注意が必要です。
絞込が実行されるのが日本語入力だと、変換を確定した後です。
なのでエンターキーを一回余計に押す感じです。

RowFilterでの構文のURL

C#

    public partial class Form1 : Form
    {
        DataTable _dt = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //サンプルデータの処理
            DataColumn dc = new DataColumn();
            dc.ColumnName = "Text";
            dc.DataType = typeof(string);
            this._dt.Columns.Add(dc);
            DataRow dr = this._dt.NewRow();
            dr[0] = "新宿駅";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "東京都渋谷区";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "東京都新宿区高田馬場";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "東京都豊島区池袋";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "東京都渋谷区道玄坂";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "渋谷駅";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "池袋駅";
            this._dt.Rows.Add(dr);
            dr = this._dt.NewRow();
            dr[0] = "東京駅";
            this._dt.Rows.Add(dr);
            //ここまでがサンプルデータ
            //DataViewがフィルタリングに便利なのです。
            DataView dv = this._dt.DefaultView;
            this.comboBox1.DataSource = dv;
            this.comboBox1.DisplayMember = "Text";
            this.comboBox1.ValueMember = "Text";
        }
        private void comboBox1_KeyDown(object sender, KeyEventArgs e)
        {
            //コンボボックスのデータの更新の為
            DataView dv = this._dt.DefaultView;
            //コンボボックスに入力された文字列でフィルター
            dv.RowFilter = "Text LIKE '*" + this.comboBox1.Text + "*'";
        }
    }

VB.NET

Public Class Form1
    Private _dt As New DataTable()
    Private Sub ComboBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBox1.KeyDown
        'コンボボックスのデータの更新の為
        Dim dv As DataView = Me._dt.DefaultView
        'コンボボックスに入力された文字列でフィルター
        dv.RowFilter = "Text LIKE '*" + Me.ComboBox1.Text + "*'"
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        'サンプルデータのための処理
        Dim dc As New DataColumn()
        dc.ColumnName = "Text"
        dc.DataType = GetType(String)
        Me._dt.Columns.Add(dc)
        Dim dr As DataRow = Me._dt.NewRow()
        dr(0) = "新宿駅"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "東京都渋谷区"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "東京都新宿区高田馬場"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "東京都豊島区池袋"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "東京都渋谷区道玄坂"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "渋谷駅"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "池袋駅"
        Me._dt.Rows.Add(dr)
        dr = Me._dt.NewRow()
        dr(0) = "東京駅"
        Me._dt.Rows.Add(dr)
        'ここまでがサンプルデータ
        'DataViewがフィルタリングに便利なのです。
        Dim dv As DataView = Me._dt.DefaultView
        Me.ComboBox1.DataSource = dv
        Me.ComboBox1.DisplayMember = "Text"
        Me.ComboBox1.ValueMember = "Text"
    End Sub
End Class








良いやや良い普通やや悪い悪い
6 3 15 3 4

投稿日時評価コメント
2024/02/13 普通 あいうえお
2024/01/12 悪い 挙動がおかしい
2022/11/10 普通 ああ
2022/06/07 普通 ああ
2021/09/22 悪い 挙動がおかしい
2021/07/25 普通 あr
2020/12/23 普通 新宿
2020/03/02 悪い 非実用的。