DataGridView 过滤器忽略单元格、单词上的变音符号(重音)
DataGridView filter ignoring diacritics (accents) on cells, words
我使用 TextBox
在 DataGridView
image 中进行过滤。这是完美的工作。
table 的单元格包含 1250 个拉丁字符。
我想搜索忽略单元格中单词的重音。
例子。
如果是文本框"knjazevacka"
,搜索结果包含"knjaževačka"
抱歉英语不好。
这是导入代码 table:
Dim blah As New System.Net.WebClient
blah.Encoding = System.Text.Encoding.UTF8
Dim str As String = blah.DownloadString(urlfiberlTextBox.Text)
Dim Results As DataSet = ConvertHTMLTablesToDataSet(str)
For Each Data As DataTable In Results.Tables
FiberList.DataSource = Data
Next
这是为了搜索:
Dim bs As New BindingSource()
bs.DataSource = FiberList.DataSource
bs.Filter = String.Format("[Column1] LIKE '*{0}*' OR [Column1] LIKE '*{0}*' OR [Column3] LIKE '*{0}*'", FiberSearchTextBox.Text)
FiberList.DataSource = bs
选项 1
Select 也来自数据库的未重音数据并在过滤器中使用
如果您可以更改 select 数据的查询,作为一个选项,当 select 从 SQL 服务器获取数据时,您还可以 select 未重音列值然后根据它们过滤数据。
例如,设置更改您的查询以包含无重音值:
SELECT Column1, Column1 COLLATE SQL_Latin1_General_CP1253_CI_AI AS Column1_UnAccented
FROM Table1
然后,使用未重音的列值执行过滤:
bindingSource1.Filter = String.Format("Column1_UnAccented LIKE '*{0}*'", textBox1.Text)
选项 2
使用 C# 使数据不重音并将它们放在新的列中并在过滤器中使用
如果您无法更改 select 查询,您可以向数据 table 添加一个新列,并使用 Blair Conrad 共享的以下方法将未重音的数据放入其中,然后根据新列进行筛选:
Public Function RemoveDiacritics(text) As String
Dim normalizedString = text.Normalize(System.Text.NormalizationForm.FormD)
Dim stringBuilder = New System.Text.StringBuilder()
For Each c In normalizedString
Dim unicodeCategory = Globalization.CharUnicodeInfo.GetUnicodeCategory(c)
If (unicodeCategory <> Globalization.UnicodeCategory.NonSpacingMark) Then
stringBuilder.Append(c)
End If
Next
Return stringBuilder.ToString().Normalize(System.Text.NormalizationForm.FormC)
End Function
如果您想使用 Filter
或 DataTable.DefaultView.RowFilter
属性,您可以使用一种方法,即您将具有变音符号的每一列转换为删除它们的字符串。
例如:
var searchText = RemoveDiacritics(this.textBox1.Text);
var table = new DataTable();
table.Columns.Add("Zgrada", typeof(string));
// sample data
table.Rows.Add("Knjaževačka 105");
table.Rows.Add("Knjaževačka 147 ulaz II");
table.Rows.Add("Knjaževačka 147 ulaz III");
table.Rows.Add("Knjaževačka 152");
table.Rows.Add("Knjaževačka 154");
table.Rows.Add("Knjaževačka 158/II");
// add the equivalent converted column
table.Columns.Add("ZgradaNormalized", typeof(string));
foreach (DataRow row in table.Rows)
row.SetField("ZgradaNormalized", RemoveDiacritics(row.Field<string>("Zgrada")));
table.DefaultView.RowFilter = string.Format("[ZgradaNormalized] LIKE '%{0}%'", searchText);
使用此方法删除从 here.
中提取的变音符号
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) !=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
我使用 TextBox
在 DataGridView
image 中进行过滤。这是完美的工作。
table 的单元格包含 1250 个拉丁字符。
我想搜索忽略单元格中单词的重音。
例子。
如果是文本框"knjazevacka"
,搜索结果包含"knjaževačka"
抱歉英语不好。
这是导入代码 table:
Dim blah As New System.Net.WebClient
blah.Encoding = System.Text.Encoding.UTF8
Dim str As String = blah.DownloadString(urlfiberlTextBox.Text)
Dim Results As DataSet = ConvertHTMLTablesToDataSet(str)
For Each Data As DataTable In Results.Tables
FiberList.DataSource = Data
Next
这是为了搜索:
Dim bs As New BindingSource()
bs.DataSource = FiberList.DataSource
bs.Filter = String.Format("[Column1] LIKE '*{0}*' OR [Column1] LIKE '*{0}*' OR [Column3] LIKE '*{0}*'", FiberSearchTextBox.Text)
FiberList.DataSource = bs
选项 1
Select 也来自数据库的未重音数据并在过滤器中使用
如果您可以更改 select 数据的查询,作为一个选项,当 select 从 SQL 服务器获取数据时,您还可以 select 未重音列值然后根据它们过滤数据。
例如,设置更改您的查询以包含无重音值:
SELECT Column1, Column1 COLLATE SQL_Latin1_General_CP1253_CI_AI AS Column1_UnAccented
FROM Table1
然后,使用未重音的列值执行过滤:
bindingSource1.Filter = String.Format("Column1_UnAccented LIKE '*{0}*'", textBox1.Text)
选项 2
使用 C# 使数据不重音并将它们放在新的列中并在过滤器中使用
如果您无法更改 select 查询,您可以向数据 table 添加一个新列,并使用 Blair Conrad 共享的以下方法将未重音的数据放入其中,然后根据新列进行筛选:
Public Function RemoveDiacritics(text) As String
Dim normalizedString = text.Normalize(System.Text.NormalizationForm.FormD)
Dim stringBuilder = New System.Text.StringBuilder()
For Each c In normalizedString
Dim unicodeCategory = Globalization.CharUnicodeInfo.GetUnicodeCategory(c)
If (unicodeCategory <> Globalization.UnicodeCategory.NonSpacingMark) Then
stringBuilder.Append(c)
End If
Next
Return stringBuilder.ToString().Normalize(System.Text.NormalizationForm.FormC)
End Function
如果您想使用 Filter
或 DataTable.DefaultView.RowFilter
属性,您可以使用一种方法,即您将具有变音符号的每一列转换为删除它们的字符串。
例如:
var searchText = RemoveDiacritics(this.textBox1.Text);
var table = new DataTable();
table.Columns.Add("Zgrada", typeof(string));
// sample data
table.Rows.Add("Knjaževačka 105");
table.Rows.Add("Knjaževačka 147 ulaz II");
table.Rows.Add("Knjaževačka 147 ulaz III");
table.Rows.Add("Knjaževačka 152");
table.Rows.Add("Knjaževačka 154");
table.Rows.Add("Knjaževačka 158/II");
// add the equivalent converted column
table.Columns.Add("ZgradaNormalized", typeof(string));
foreach (DataRow row in table.Rows)
row.SetField("ZgradaNormalized", RemoveDiacritics(row.Field<string>("Zgrada")));
table.DefaultView.RowFilter = string.Format("[ZgradaNormalized] LIKE '%{0}%'", searchText);
使用此方法删除从 here.
中提取的变音符号static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) !=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}