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