2016-10-27 4 views
1

У меня есть DataGridView привязка к DataSet, некоторая ценность (имя) имеет акцент (например: é, í, ž, ć, é, á), и я бы выполнил акцентирующий акцент.C# Как фильтровать привязку Datagridview к набору данных - Accent Insentitive

Обычно я фильтрование моей 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; 
} 

но не работает.

ответ

0

Я могу предложить следующее решение.

Добавить в новый столбец под названием 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 методом. Затем удалите все диакритики с регулярными выражениями. M является Unicode category "Все диакритические знаки".

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 + "%'"; 
} 
+0

Я думал, что существует другой способ сделать это, но я сделаю это так. Спасибо за вашу помощь. – KTG