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

hue*_*hue 5 c# database datagridview

这是我目前的代码:

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

    }
Run Code Online (Sandbox Code Playgroud)

但是,每当我在文本框中输入内容时,我的数据网格表都会过滤所有内容并变为空白.知道为什么吗?先感谢您!

OhB*_*ise 13

您看到空白的可能原因DataGridView是您的过滤字符串搜索与TextBox文本的完全匹配.

"Name='{0}'"
Run Code Online (Sandbox Code Playgroud)

因为您在TextBox.TextChanged事件中更新此过滤器,所以第一次输入字符时 - 找不到匹配项.例如,给定以下网格:

?????????????                    ??????????
? ID ? Name ?      searchTextBox ?        ?
?????????????                    ??????????
? 1  ? Foo  ?
? 2  ? Bar  ?
? 3  ? Baz  ?
?????????????
Run Code Online (Sandbox Code Playgroud)

输入Bar将给出以下结果:

?????????????                    ??????????
? ID ? Name ?      searchTextBox ? B      ?
?????????????                    ??????????
?????????????
?????????????                    ??????????
? ID ? Name ?      searchTextBox ? Ba     ?
?????????????                    ??????????
?????????????
?????????????                    ??????????
? ID ? Name ?      searchTextBox ? Bar    ?
?????????????                    ??????????
? 2  ? Bar  ?
?????????????
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,我在下面提供了一些选项.如果情况并非如此,那么你就有了一个谜.


  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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. StartsWith匹配:对文本更改进行更流畅的过滤:

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

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