c#如何过滤Datagridview绑定到数据集-重音不敏感

本文关键字:-重 数据集 绑定 Datagridview 何过滤 过滤 | 更新日期: 2023-09-27 18:15:15

我有一个DataGridView绑定到一个DataSet,一些值(Name)有重音(例如:, í, z, z, ),我想执行一个重音不敏感的过滤。

通常我像这样过滤我的DataGridView:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    MyDataSet.People.DefaultView.RowFilter = "Name LIKE '%" + textBox1.Text + "%'";
    dataGridView1.DataSource = MyDataSet.People.DefaultView;
}

我试图改变这个在我的数据库:

CREATE TABLE [dbo].[People] (
[Num]        INT           NOT NULL,
[Name]     NVARCHAR (50) NOT NULL
);

by this

CREATE TABLE [dbo].[People] (
[Num]        INT           NOT NULL,
[Name]     NVARCHAR (50) COLLATE Latin1_General_CI_AI NOT NULL
);

并尝试更改:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    MyDataSet.People.DefaultView.RowFilter = "Name LIKE '%" + textBox1.Text + "%' COLLATE Latin1_General_CI_AI";
    dataGridView1.DataSource = MyDataSet.People.DefaultView;
}

c#如何过滤Datagridview绑定到数据集-重音不敏感

我可以提供以下决定。

为数据表添加名为NameWithoutAccent的新列。

MyDataSet.People.Columns.Add("NameWithoutAccent", typeof(string));

用已删除重音的值填充此列。筛选将按此列进行。

foreach (DataRow row in MyDataSet.People.Rows)
{
    string name = (string)row["Name"];
    string nameWithoutAccent = RemoveAccent(name);
    row["NameWithoutAccent"] = nameWithoutAccent;
}

首先将字符串规范化以删除string的重音。规范化的方法。然后用正则表达式删除所有的变音符号。M是Unicode类别"All diacritic marks"。

public string RemoveAccent(string name)
{
    string normalizedName = name.Normalize(NormalizationForm.FormD);
    string pattern = @"'p{M}";
    string nameWithoutAccent = Regex.Replace(normalizedName, pattern, "");
    return nameWithoutAccent;
}

在数据绑定后隐藏此列。

dataGridView1.Columns["NameWithoutAccent"].Visible = false;

输入过滤器也从重音中清除。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string nameWithoutAccent = RemoveAccent(textBox1.Text);
    MyDataSet.People.DefaultView.RowFilter = "NameWithoutAccent LIKE '%" + nameWithoutAccent + "%'";
}