我在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
,那么当用户输入时,例如Joh
或JohnSm
,就会对此进行过滤。
当出于任何原因输入网络名称时,我的问题就出现了,因此em_netname
等于John.Smith.
或John,Smith
等内容。当用户搜索JohnSm
时,这当然不会显示在网络名称中。
我的问题是如何在C#中最好地处理这种情况?
答案 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/