C# 在用DataTable填充的DataGridView上使用RowFilter的正确方法是什么?

C# 在用DataTable填充的DataGridView上使用RowFilter的正确方法是什么?,c#,.net,winforms,datagridview,datatable,C#,.net,Winforms,Datagridview,Datatable,我遵循了中的方法对datagridview执行搜索 下面是我的尝试。我想在文本更改时停止使用DgvSearch方法查询数据库,而是使用RowFilter 在当前尝试中,datagridview是从LoadDataParts正确填充的,当我开始在TxtPP_GBC2中键入时,我只看到列标题,没有引发异常 GBC列定义为INT 预期结果->TxtPP\u GBC2\u TextChanged的行为与DgvSearch相同 您可以使用Convert expression函数将int列的值转换为字符串,

我遵循了中的方法对datagridview执行搜索

下面是我的尝试。我想在文本更改时停止使用DgvSearch方法查询数据库,而是使用RowFilter

在当前尝试中,datagridview是从LoadDataParts正确填充的,当我开始在TxtPP_GBC2中键入时,我只看到列标题,没有引发异常

GBC列定义为INT

预期结果->TxtPP\u GBC2\u TextChanged的行为与DgvSearch相同

您可以使用Convert expression函数将int列的值转换为字符串,并使用以下筛选器进行比较:

private DataTable LoadData()
{
    var dt = new DataTable();
    dt.Columns.Add("C1", typeof(int));
    dt.Rows.Add(1);
    dt.Rows.Add(11);
    dt.Rows.Add(2);
    dt.Rows.Add(22);
    return dt;       
}
private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = LoadData();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
    var filter = "";
    if (!string.IsNullOrEmpty(textBox1.Text))
        filter = $"Convert([C1], System.String) = '{textBox1.Text}'";
    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = filter;
}
如果出于任何原因您更喜欢LIKE运算符,则需要将过滤器更改为:

filter = $"Convert([C1], System.String) LIKE '%{textBox1.Text}%'";

如果列为int,为什么要将其与字符串进行比较?也许你在寻找什么?你能提供工作实例@RezaAghaei吗?哇;我强烈建议您重新考虑——将一个包含所有部分的整个数据库表加载到一个本地数据表中,这样您就可以搜索它们,这在所有情况下都是一个相当糟糕的想法,但在大多数人为的小数据集示例中除外。数据库非常擅长搜索数据。C数据表在搜索方面比较差。在网络上拖拽数百万条记录以便在本地搜索是一个糟糕的想法。也许考虑植入一个延迟,这样你只在用户停止键入后1秒运行一个搜索,这样你就不会在每个按键上进行搜索。打电话debouncing@CaiusJard-谢谢你,我明白了。您建议我返回查询SQL,但在查询之间实现延迟?是的,这是我的建议-要么让用户按return等启动搜索,要么每次按一个键将计数器重置为0,在100ms计时器上递增,只有在达到10秒时才启动查询etc@KubaDo您需要学习如何隔离问题以及如何调试代码。它在一个孤立的环境中运行良好。我将在答案中添加完整的代码。非常感谢,您的代码在使用LIKE运算符时没有达到预期效果,我已经使用DataView类管理了预期结果,但您在答案中需要的唯一更改是将=更改为LIKE,这是最初建议的注释,我会说这意味着答案有效。
filter = $"Convert([C1], System.String) LIKE '%{textBox1.Text}%'";