解决文本搜索框输入中文出现单引号报错问题

为什么会出现单引号

拼音中单引号作为拼音字节的分隔符出现当你输入的声母超过一个,系统会认为你是输入了两个中文符号,

出现错误报错

如图:
解决文本搜索框输入中文出现单引号报错问题报错
解决文本搜索框输入中文出现单引号报错问题

视图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;
            }
    }