コンボボックスで入力した文字列にマッチするデータを絞り込み検索したい時のサンプルです。
特徴は、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
