如何使用文本框在数据网格视图中搜索数据?
这是我目前的代码:
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 ║ ╚════╩══════╝
如果是这种情况,我在下面提供了一些选项。 如果情况并非如此,那么你就有了一个谜。
-
完全匹配:请考虑使用以下事件处理程序,以便仅在输入完整搜索文本后应用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); } }
-
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); }
只需针对填充网格的数据库创建一个新查询?
将文本框文本与LIKE一起使用
编辑:
如果您希望使用搜索更新网格,请使用AJAX。
OhBeWise答案是最好的,但在我添加一些东西以获得积分之前我不允许喜欢它。
所以我会添加这个,请记住在OhBeWise的答案中,您过滤要列出的行但使用查询中的列名称。 用于设置datagridview的数据源的查询。
对于我的示例中的实例,“LoginID”位于select语句中。
(dataGridViewTheToGrid.DataSource as DataTable).DefaultView.RowFilter = string.Format("LoginID LIKE '{0}%'", textBoxFindUserID.Text);