你看到空白的 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 ║
╚════╩══════╝
如果是这种情况,那么我在下面提供了几个选项。如果不是这种情况,那么你就有一个谜团。
完全匹配:考虑使用以下事件处理程序,以便仅在输入完整的搜索文本后才应用过滤器:
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);
}