1

DataGridView绑定到 a DataSet,某个值(名称)有重音(例如:é、í、ž、ć、é、á),我会执行过滤重音不敏感。

通常我会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
);

这样

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;
}

但它不起作用。

4

1 回答 1

1

我可以提供以下决定。

添加到数据表的新列名为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.Normalize方法规范化字符串以删除重音。然后用正则表达式删除所有变音符号。MUnicode 类别“所有变音符号”。

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 + "%'";
}
于 2016-10-27T23:05:30.130 回答