DataRow过滤特殊字符

时间:2015-10-16 08:42:00

标签: c# wpf datagrid

我在C#中有一个使用以下方法过滤的DataGrid;

    private void SearchGrid(object sender, TextChangedEventArgs e)
    {
        DataView dv = dataGrid.ItemsSource as DataView;
        if (nNameRad.IsChecked == true)
        {
            dv.RowFilter = "em_netname LIKE '%" +searchBox.Text+ "%'";
        }
        if (deptRad.IsChecked == true)
        {
            dv.RowFilter = "em_dept LIKE '%" + searchBox.Text + "%'";
        }
        if (sNameRad.IsChecked == true)
        {
            dv.RowFilter = "em_name LIKE '%" + searchBox.Text + "%'";
        }
        if (initRad.IsChecked == true)
        {
            dv.RowFilter = "em_init LIKE '%" + searchBox.Text + "%'";
        }

        // If the search box is not empty the user cannot add a new employee
        if (!string.IsNullOrEmpty(searchBox.Text))
        {
            newEmpButton.IsEnabled = false;
            newEmpDisabledLabel.Visibility = Visibility.Visible;
        } else
        {
            newEmpButton.IsEnabled = true;
            newEmpDisabledLabel.Visibility = Visibility.Hidden;
        }
    }

这一切都正常,直到用户在网格中输入我未考虑的内容。例如,如果em_netname等于JohnSmith,那么当用户输入时,例如JohJohnSm,就会对此进行过滤。

当出于任何原因输入网络名称时,我的问题就出现了,因此em_netname等于John.Smith.John,Smith等内容。当用户搜索JohnSm时,这当然不会显示在网络名称中。

我的问题是如何在C#中最好地处理这种情况?

2 个答案:

答案 0 :(得分:0)

您可以使用

删除选择中的空格
WHERE 
    em_name LIKE '%" + searchBox.Text + "%'
    OR
    REPLACE(em_name, ',', '') LIKE '%" + searchBox.Text + "%'
    OR
    REPLACE(em_name, '.', '') LIKE '%" + searchBox.Text + "%'

所以它匹配搜索名字和姓氏连接

答案 1 :(得分:0)

您必须使用SOUNDEX功能。

Soundex是一种算法,可根据单词的发音方式将单词转换为编码字符串。这允许您根据发音而不是二进制匹配来比较单词。例如,Zach和Zack的发音方式完全相同。但是,字符串“Zach”不等于字符串“Zack”,这意味着正常搜索不会将它们标记为匹配。通过Soundex运行“Zach”和“Zack”之后,你会看到它们都具有相同的编码并被视为相同。

因此,在您的情况下,soundex将忽略任何标点符号,并将搜索所需的字符串以及具有相似发音的其他字符串。

请点击此链接实施http://www.techrepublic.com/blog/software-engineer/how-do-i-implement-the-soundex-function-in-c/