【问题标题】:DataGridView filter ignoring diacritics (accents) on cells, wordsDataGridView 过滤器忽略单元格、单词上的变音符号(重音)
【发布时间】:2015-12-17 17:08:44
【问题描述】:

我使用TextBox 过滤DataGridView image。这是完美的工作。 表格的单元格包含 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

【问题讨论】:

    标签: .net vb.net winforms datagridview filter


    【解决方案1】:

    选项 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
    

    【讨论】:

    • 看来他的数据表来自DownloadString 调用。
    • 我知道这个删除变音符号的解决方案。但这对我来说不是一个好的解决方案。
    • 哪一个不适合你?您可以使用上述任一选项:)第一个适合您可以更改查询的情况,另一个适合您无法更改查询的情况。
    • 我不完全理解选项 1。我使用 DownloadString 和 ConvertHTMLTablesToDataSet 在 datageradview 中导入数据。添加带有非重音数据的新列对我来说是个问题。
    • 选项 1 适用于您有权访问提供数据的选择查询时。在您使用 ConvertHTMLTablesToDataSet 的情况下,选项 2 似乎适合您。
    【解决方案2】:

    如果您想使用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 2017-01-27
      • 2011-03-21
      • 1970-01-01
      • 2010-11-28
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多