2016-10-27 13 views
1

DataGridViewDataSetにバインドされていますが、値(Name)にアクセント(ex:é、í、ž、É、é、á)があります。フィルタリングのアクセントは無視されます。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) COLLATE Latin1_General_CI_AI NOT NULL 
); 

によって

CREATE TABLE [dbo].[People] (
[Num]  INT   NOT NULL, 
[Name]  NVARCHAR (50) 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)); 

この列には、アクセント記号を削除した値を入力します。この列によってフィルタリングが行われます。

最初にString.Normalizeメソッドでアクセントを削除するために文字列を正規化します。その後、正規表現ですべての発音区別記号を削除します。 MUnicode 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

関連する問題