表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用

BindingSourceコンポーネントのFilterプロパティを利用するとレコードを絞り込んで表示できます。

事前準備

BindingSourceコンポーネントについてはこちらの記事を参照してください。

こちらの記事を参照して、データベースのテーブルのレコードをDataGridViewで表示するアプリケーションを作成します。

UI

下図のUIを作成します。先に作成したデータベースのテーブルのレコードをDataGridViewで表示するアプリケーションのフォームにTextBoxとButtonを1つずつ追加します。(上部のボタン2つはダミーデータを作成するためのボタンです。)

表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用:画像1

コード

以下のコードを記述します。

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,button2

button1にはランダムなname,valueの値を持つレコードを100件追加するコードを記述しています。button2にはテーブルのレコードをすべて削除するコードを記述しています。

button3

private void button3_Click(object sender, EventArgs e)
{
  simpleKeyValueBindingSource.Filter = string.Format("name like '{0:s}'", textBox1.Text);
}

BindingSourceコンポーネントのFilterプロパティにフィルタする条件式を設定します。書式はSQL文のWhere句の条件式に似ています。一部使用できない表現もあります。こちらの記事も参照してください。

実行結果

プロジェクトを実行します。アプリケーションが起動し下図のウィンドウが表示されます。DataGridViewにはすべてのレコードが表示されています。
表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用:画像2

テキストボックスに"4%"と入力し、Button3を押します。Nameの先頭文字が"4"で始まるレコードのみが抽出されて表示されます。
表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用:画像3

テキストボックスに"c4%"と入力すると、Nameの先頭が"c4"で始まるレコードのみが表示されます。
表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用:画像4

補足

文字列以外のフィールドでもフィルタできます。

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以下のレコードを表示できます。
表示レコードの絞り込みをする - BindingSourceコンポーネントのFilterプロパティの利用:画像5

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2012-10-23
Copyright © 1995–2025 iPentec all rights reserverd.