📜  c# datagridview filter textbox - C# (1)

📅  最后修改于: 2023-12-03 14:59:39.848000             🧑  作者: Mango

C# DataGridView Filter Textbox

在C#中,使用DataGridView控件展示数据是非常常见的。而有时我们会需要添加搜索功能来过滤数据,使得用户能够快速地找到他们感兴趣的内容。本文将介绍如何给DataGridView添加一个文本框,使得用户可以通过输入关键字来实现对DataGridView的数据进行过滤。

准备工作

在这个例子中,我们将使用一个名为“NorthwindDatabase”的数据库,里面包含一个名为“Customers”的表格。我们需要先安装SQLite,然后将“NorthwindDatabase”文件夹下的“Northwind.sqlite”文件拷贝到我们的工作目录中。

进入Visual Studio,我们需要先添加一个DataGridView控件和一个TextBox控件。在Form的Load事件中,我们需要为DataGridView绑定数据。由于我们使用的是SQLite数据库,我们需要添加System.Data.SQLite依赖包。

using System.Data.SQLite;

namespace DataGridViewFilterTextBox
{
    public partial class Form1 : Form
    {
        private SQLiteConnection con;

        public Form1()
        {
            InitializeComponent();

            InitializeDatabase();
            InitializeDataGridView();
        }

        private void InitializeDatabase()
        {
            string dataSource = "Data Source=Northwind.sqlite";
            con = new SQLiteConnection(dataSource);
            con.Open();
        }

        private void InitializeDataGridView()
        {
            string query = "SELECT * FROM Customers";

            SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, con);
            DataTable dataTable = new DataTable();
            adapter.Fill(dataTable);

            dataGridView1.DataSource = dataTable;
        }
    }
}
添加文本框

我们需要给Form添加一个TextBox控件。为了便于用户输入关键字,我们需要在其右上方添加清除按钮。在Visual Studio的工具箱中,我们可以找到Button控件,并将其拖拽到TextBox控件的右侧。将其名字设置为“clearButton”,并设置Text属性为“X”。

为了让用户能够通过TextBox去过滤DataGridView的数据,我们需要在TextBox的TextChanged事件发生时更新DataGridView的数据源。我们先将过滤方法写出来:

private void FilterDataGrid(string columnName, string keyword)
{
    string query = $"SELECT * FROM Customers WHERE {columnName} LIKE @keyword";

    SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, con);

    adapter.SelectCommand.Parameters.AddWithValue("@keyword", $"%{keyword}%");

    DataTable dataTable = new DataTable();
    adapter.Fill(dataTable);

    dataGridView1.DataSource = dataTable;
}

该方法会接收一个columnName和一个keyword参数,用于指定过滤的列名和关键字。该方法的作用是将符合条件的数据查询出来后更新DataGridView的数据源。

下一步,我们需要在TextBox的TextChanged事件中调用FilterDataGrid方法:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.Text.Trim() == "")
    {
        InitializeDataGridView();
    }
    else
    {
        FilterDataGrid("ContactName", textBox1.Text.Trim());
    }
}

当用户输入内容到TextBox中时,TextChanged事件会被触发。我们判断TextBox是否为空,如果为空,则还原DataGridView的数据源为原始数据;否则,调用FilterDataGrid方法进行过滤。

最后,还需要为clearButton添加Click事件,当用户点击该按钮时,我们将TextBox清空即可:

private void clearButton_Click(object sender, EventArgs e)
{
    textBox1.Text = "";
}
完整代码
using System;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;

namespace DataGridViewFilterTextBox
{
    public partial class Form1 : Form
    {
        private SQLiteConnection con;

        public Form1()
        {
            InitializeComponent();

            InitializeDatabase();
            InitializeDataGridView();
        }

        private void InitializeDatabase()
        {
            string dataSource = "Data Source=Northwind.sqlite";
            con = new SQLiteConnection(dataSource);
            con.Open();
        }

        private void InitializeDataGridView()
        {
            string query = "SELECT * FROM Customers";

            SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, con);
            DataTable dataTable = new DataTable();
            adapter.Fill(dataTable);

            dataGridView1.DataSource = dataTable;
        }

        private void FilterDataGrid(string columnName, string keyword)
        {
            string query = $"SELECT * FROM Customers WHERE {columnName} LIKE @keyword";

            SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, con);

            adapter.SelectCommand.Parameters.AddWithValue("@keyword", $"%{keyword}%");

            DataTable dataTable = new DataTable();
            adapter.Fill(dataTable);

            dataGridView1.DataSource = dataTable;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text.Trim() == "")
            {
                InitializeDataGridView();
            }
            else
            {
                FilterDataGrid("ContactName", textBox1.Text.Trim());
            }
        }

        private void clearButton_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }
    }
}
结束语

本文介绍了如何使用TextBox和DataGridView控件实现搜索功能。有了搜索功能,让用户能够快速查找需要的数据,使得我们的应用更加友好易用。