DataGridView过滤器忽略单元格,单词上的变音符号(重音符号)

时间:2015-12-17 17:08:45

标签: .net vb.net winforms datagridview filter

我在TextBox image中使用DataGridView进行过滤。这是完美的工作。 表的单元格包含拉丁语1250个字符。 我想搜索忽略单元格中单词的重音。 例。 如果是文本框"knjazevacka",则搜索结果包含"knjaževačka" 抱歉英文不好。 这是导入表的代码:

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

2 个答案:

答案 0 :(得分:4)

选项1

还从数据库中选择非重音数据并在过滤器中使用

如果您可以更改选择数据的查询,作为选项,从SQL Server中选择数据时,您还可以选择非重音列值,然后根据它们过滤数据。

例如,设置更改查询以包含非重音值:

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#将数据设为非重音并将其放入新列并在过滤器中使用

如果您无法更改选择查询,则可以使用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

答案 1 :(得分:1)

如果您希望以一种方式使用FilterDataTable.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);
}