如何使用文本框在数据网格视图中搜索数据?

6

这是我的当前代码:

private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", searchTextBox.Text);

    }

然而,每当我在文本框中输入内容时,我的数据网格表格会过滤掉所有内容,并变为空白。你知道为什么吗?提前感谢你!

你确定该事件已经触发了吗? - Nalaka
如果您创建了一个BindingSource来将DataTable绑定到DataGridView,您可以使用BindingSource的“Filter”属性来过滤DGV,而无需在过滤条件更改时每次更新数据源。 - Graffito
请遵循这个 stackoverflow 答案 https://stackoverflow.com/a/54261346/4358971。 - Ritesh Kumar
4个回答

19

你看到空白的 DataGridView可能原因是因为你的过滤字符串正在搜索与 TextBox 文本完全匹配的结果。

"Name='{0}'"
因为您在TextBox.TextChanged事件中更新此过滤器,所以第一次输入字符时没有找到匹配项。例如,给定以下网格:
╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║        ║
╠════╬══════╣                    ╚════════╝
║ 1  ║ Foo  ║
║ 2  ║ Bar  ║
║ 3  ║ Baz  ║
╚════╩══════╝

输入Bar将得到以下结果:

╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ B      ║
╠════╬══════╣                    ╚════════╝
╚════╩══════╝
╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ Ba     ║
╠════╬══════╣                    ╚════════╝
╚════╩══════╝
╔════╦══════╗                    ╔════════╗
║ ID ║ Name ║      searchTextBox ║ Bar    ║
╠════╬══════╣                    ╚════════╝
║ 2  ║ Bar  ║
╚════╩══════╝

如果是这种情况,那么我在下面提供了几个选项。如果不是这种情况,那么你就有一个谜团。


  1. 完全匹配:考虑使用以下事件处理程序,以便仅在输入完整的搜索文本后才应用过滤器:

private void searchTextBox_Leave(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(searchTextBox.Text))
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Empty;
    }
    else
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", searchTextBox.Text);
    }
}
  • StartsWith 匹配:在文本更改时进行更流畅的过滤:

  • private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name LIKE '{0}%'", searchTextBox.Text);
    }
    
  • 包含匹配项:再次,流体过滤:

  • private void searchTextBox_TextChanged(object sender, EventArgs e)
    {
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name LIKE '%{0}%'", searchTextBox.Text);
    }
    

    哇,非常感谢!现在它可以工作了。你介意我问另一个问题吗?如何刷新 datagridview 中的数据?datagridview1.refresh(); 和 datagridview1.update(); 对我都不起作用。 - huehuehue
    如果您正在使用精确匹配,并且您的意思是在清空搜索框后刷新数据:请参阅我的答案编辑。如果您有其他想法,则可能需要更多信息,如果信息量很大,则可能需要发布单独的问题。 - OhBeWise
    我使用了第三种方法,但编译器总是显示错误“对象引用未设置为对象的实例”。这是什么原因? - Travis Su
    @TravisSu 这是一个 NullReferenceException(空引用异常)。你访问的对象中可能有一个未被初始化。 - OhBeWise
    @OhBeWise 我需要初始化 DataTableDefaultView 吗? - Travis Su

    1
    此外,如果您想要进行多列搜索,请使用以下代码。
    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name LIKE '%{0}%' OR ID LIKE '%{0}%'", searchTextBox.Text);
    

    1

    只需在填充网格的数据库中创建新查询即可?

    使用文本框文本和LIKE。

    编辑:

    如果您希望网格随搜索更新,请使用AJAX。


    1

    OhBeWise的回答是最好的,但在我添加一些内容以获取积分之前,我不被允许点赞。

    所以我会补充一下,记住在OhBeWise的答案中,您正在使用查询中的列名来过滤要列出的行。该查询用于设置datagridview的数据源。

    例如,在我的示例中,“LoginID”在select语句中。

    (dataGridViewTheToGrid.DataSource as DataTable).DefaultView.RowFilter = string.Format("LoginID LIKE '{0}%'", textBoxFindUserID.Text);
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接