解决文本搜索框输入中文出现单引号报错问题
为什么会出现单引号
拼音中单引号作为拼音字节的分隔符出现当你输入的声母超过一个,系统会认为你是输入了两个中文符号,
出现错误报错
如图:
报错
视图XAML代码
<TextBox x:Name="txt_Select" ToolTip="请输入:姓名\员工账号\密码\备注"
Margin="0,5,10,0" Width="341" Height="24" SelectionChanged="txt_Select_SelectionChanged"/>
后台C#代码
private void txt_Select_SelectionChanged(object sender, RoutedEventArgs e)
{
//声明一个空的字符串用于存储筛选条件
string select = "";
//获取用户查询输入的值
//Regex reg = new Regex(@"^[0 - 9] + (’[0-9])$");
string strS = txt_Select.Text.Trim().Replace("'","/x27");
string asaf = strS;
//判断用户有没有输入
if (strS != "")
{
//模糊查询内容
select += " 姓名 like '%'+'" + strS + "'+'%'" +
" or 账号 like '%'+'" + strS + "'+'%'" +
" or 密码 like '%'+'" + strS + "'+'%'" +
" or 备注 like '%'+'" + strS + "'+'%'";
}
}
后台断点可以看到我输入的ab被获取传递到字符串select 里面时变成了
也就是 " 姓名 like ‘%’+‘a’b’+’%’ or 账号 like ‘%’+‘a’b’+’%’ or 密码 like ‘%’+‘a’b’+’%’ or 备注 like ‘%’+‘a’b’+’%’" 这么个东西…
原因
这是因为我使用的是SelectionChanged事件,当前所选内容更改时发生,也就是说当我在页面上有任何对搜索框操作时都会触发这个事件,所以当我输入ab时,因为ab是两个声母,系统会认为我是输入两个中文字符,
所以会将输入ab中间添加拼音的分隔符,也就是 ’ 一个单引号,所以当它被后台捕捉到时就会变成那样使得b被系统当作了运算符处理+变成了变量
解决方法:
可以使用正则表达式将’替换成它的ASCII码或者删掉
也可以调用String的 Replace方法将单引号替换成它的ASCII码或者删掉如下将方法txt_Select_SelectionChanged更改成
private void txt_Select_SelectionChanged(object sender, RoutedEventArgs e)
{
//声明一个空的字符串用于存储筛选条件
string select = "";
//获取用户查询输入的值
//Regex reg = new Regex(@"^[0 - 9] + (’[0-9])$");
string strS = txt_Select.Text.Trim().Replace("'","/x27");
string asaf = strS;
//判断用户有没有输入
if (strS != "")
{
//模糊查询内容
select += " 姓名 like '%'+'" + strS + "'+'%'" +
" or 账号 like '%'+'" + strS + "'+'%'" +
" or 密码 like '%'+'" + strS + "'+'%'" +
" or 备注 like '%'+'" + strS + "'+'%'";
}
}
使用String的 Replace方法将获取到的字符串里的单引号替换成它的ASCII码
哦,还有一个最无脑的操作,就是使用try catch 捕捉异常,然后,反正知道它这里报错是因为从页面上获取的字符串中出现了单引号,而单引号又不是我们需要查找的,那就不理它,直接返回就好了
不过这里需要注意的是
因为try catch 是封闭的所以需要把变量定义在try catch 外面否则会报错
下面是我那个方法完整的代码
因为报错是在DataTable dtselect = MyUC_DeMaXiYa.UserControl_Loaded_SelectStaffAccountManage().Tables[0];这句代码里,所以我干脆把全部代码写出来,懒得重写了
private void txt_Select_SelectionChanged(object sender, RoutedEventArgs e)
{
try
{ //声明一个空的字符串用于存储筛选条件
string select = "";
//获取用户查询输入的值 /x27
//Regex reg = new Regex(@"^[0 - 9] + (’[0-9])$");
string strS = txt_Select.Text.Trim().Replace("'", "/x27");
string asaf = strS;
//判断用户有没有输入
if (strS != "")
{
//模糊查询内容
select += " 姓名 like '%'+'" + strS + "'+'%'" +
" or 账号 like '%'+'" + strS + "'+'%'" +
" or 密码 like '%'+'" + strS + "'+'%'" +
" or 备注 like '%'+'" + strS + "'+'%'";
}
//查询出全部数据
DataTable dtselect = MyUC_DeMaXiYa.UserControl_Loaded_SelectStaffAccountManage().Tables[0];
//因为DataTable没办法直接接收条件
DataView dv = new DataView(dtselect);
DataTable dt = new DataTable();
if (select != "")
{
//筛选数据
dv.RowFilter = select;
dt = dv.ToTable();
}
if (select == "")
{
//查询全部数据
dt = dv.ToTable();
}
dgAccountManage.ItemsSource = dt.DefaultView;
} catch
{
return;
}
}