BindingSourceコンポーネントのFilterプロパティを利用するとレコードを絞り込んで表示できます。
BindingSourceコンポーネントについてはこちらの記事を参照してください。
こちらの記事を参照して、データベースのテーブルのレコードをDataGridViewで表示するアプリケーションを作成します。
下図のUIを作成します。先に作成したデータベースのテーブルのレコードをDataGridViewで表示するアプリケーションのフォームにTextBoxとButtonを1つずつ追加します。(上部のボタン2つはダミーデータを作成するためのボタンです。)
以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace SimpleFilter
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void FormMain_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを 'iPentecSandBoxDataSet.SimpleKeyValue' テーブルに読み込みます。
//必要に応じて移動、または削除をしてください。
this.simpleKeyValueTableAdapter.Fill(this.iPentecSandBoxDataSet.SimpleKeyValue);
}
//ランダムな値のレコードを挿入
private void button1_Click(object sender, EventArgs e)
{
string constr = "(データベースへの接続文字列)";
SqlConnection con = new SqlConnection(constr);
con.Open();
try {
for (int i = 0; i < 100;i++ ) {
Random rnd = new Random();
int value = rnd.Next(10000000);
Guid g = System.Guid.NewGuid();
string name = g.ToString("N").Substring(0, 8);
string sqlstr = "insert into SimpleKeyValue (name, value) values(@name, @value)";
SqlCommand com = new SqlCommand(sqlstr, con);
AddSqlParameter(com, "name", SqlDbType.NChar, name);
AddSqlParameter(com, "value", SqlDbType.Int, value);
com.ExecuteNonQuery();
}
}
finally {
con.Close();
}
}
//レコードをすべて削除
private void button2_Click(object sender, EventArgs e)
{
string constr = "(データベースへの接続文字列)";
SqlConnection con = new SqlConnection(constr);
con.Open();
try {
string sqlstr = "delete from SimpleKeyValue";
SqlCommand com = new SqlCommand(sqlstr, con);
com.ExecuteNonQuery();
}
finally {
con.Close();
}
}
private void button3_Click(object sender, EventArgs e)
{
simpleKeyValueBindingSource.Filter = string.Format("name like '{0:s}'", textBox1.Text);
}
public static void AddSqlParameter(SqlCommand com, string ParameterName, SqlDbType type, Object value)
{
SqlParameter param = com.CreateParameter();
param.ParameterName = ParameterName;
param.SqlDbType = type;
param.Direction = ParameterDirection.Input;
param.Value = value;
com.Parameters.Add(param);
}
}
}
button1にはランダムなname,valueの値を持つレコードを100件追加するコードを記述しています。button2にはテーブルのレコードをすべて削除するコードを記述しています。
private void button3_Click(object sender, EventArgs e)
{
simpleKeyValueBindingSource.Filter = string.Format("name like '{0:s}'", textBox1.Text);
}
BindingSourceコンポーネントのFilterプロパティにフィルタする条件式を設定します。書式はSQL文のWhere句の条件式に似ています。一部使用できない表現もあります。こちらの記事も参照してください。
プロジェクトを実行します。アプリケーションが起動し下図のウィンドウが表示されます。DataGridViewにはすべてのレコードが表示されています。
テキストボックスに"4%"と入力し、Button3を押します。Nameの先頭文字が"4"で始まるレコードのみが抽出されて表示されます。
テキストボックスに"c4%"と入力すると、Nameの先頭が"c4"で始まるレコードのみが表示されます。
文字列以外のフィールドでもフィルタできます。
private void button3_Click(object sender, EventArgs e)
{
simpleKeyValueBindingSource.Filter = string.Format("value < {0:d}", Convert.ToInt32(textBox1.Text));
}
button3のClickイベントのコードを上記で実装し、テキストボックスに"5000000"を入力しButton3を押すとValueが5000000以下のレコードを表示できます。