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

这是我目前的代码:

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

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

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

 "Name='{0}'" 

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

 ╔════╦══════╗ ╔════════╗ ║ 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. 完全匹配:请考虑使用以下事件处理程序,以便仅在输入完整搜索文本后应用filter:

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

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

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

只需针对填充网格的数据库创建一个新查询?

将文本框文本与LIKE一起使用

编辑:

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

OhBeWise答案是最好的,但在我添加一些东西以获得积分之前我不允许喜欢它。

所以我会添加这个,请记住在OhBeWise的答案中,您过滤要列出的行但使用查询中的列名称。 用于设置datagridview的数据源的查询。

对于我的示例中的实例,“LoginID”位于select语句中。

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