如何用text_changed事件,只输入汉字和退格和删除,输错时显示个msg"输入汉字"点击确定,向前删除一个字符?

朋友的思路:需要把前一次判断成立的内容记录下来,如果下一次改变了,结果是非法的,那么用之前记录的内容将改变后的内容替换掉,当然光标位置也要同时记录,并且替换之后要把之前的... 朋友的思路:需要把前一次判断成立的内容记录下来,如果下一次改变了,结果是非法的,那么用之前记录的内容将改变后的内容替换掉,当然光标位置也要同时记录,并且替换之后要把之前的光标位置也赋值回去,这样让人感觉仅仅是没有录入进去而已。
我这样写完,一调试,调试失败,程序是可以运行,但不管输什么都弹出MSG,得点2、3次才能取消,而且接着程序卡死退出调试。这咋办求各位熟手帮我这个菜鸟按我朋友的意思改下我源码吧? :
private void textBox1_TextChanged(object sender, EventArgs e)
{
//此为只能输入汉字 实验版
string temp;
temp = textBox1.Text;
for (int i = textBox1.SelectionStart; i <= textBox1.Text.Length; i++) //定义i为起始位置
if (IsChineseCh(textBox1.Text) == false)
//先弹出MSG提示
MessageBox.Show("你输入的不是汉字");
//然后去掉最后一个字符,设置SelectionStart属性让textbox获得焦点
string strNew = this.textBox1.Text.Substring(0, this.textBox1.Text.Length - 1);
this.textBox1.Text = strNew;
this.textBox1.SelectionStart = this.textBox1.Text.Length;
this.textBox1.Focus();
}
展开
 我来答
CodeBlove
2015-03-13 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:247万
展开全部

基本思路是对的,但是你的程序有问题的,先不说你用循环效率低下的问题,主要是当你在循环中修改字符串后,其长度改变了,而for循环是依赖于字符长度的,这样一来会造成循环提前结束,如果输入的字符在尾部问题不大,如果在中间插入,会导致后续字符串会丢失。

 

而最大问题在于,当你在循环中修改文本后又会触发chage事件,造成多次循环嵌套从而混乱。

 

另外一个问题,既然使用循环遍历每个字符,就不应该在循环中将整个文本框中的字符串作为参数去校验,造成多余的调用开销;其次,既然遍历所有字符,裁剪字符串时不应该只考虑裁剪尾部字符的情况。

 

 

正确的做法是:

1,在当前窗口类中定义一个跟踪光标的索引变量,假设为TextIndex,初始化为0。

2、在文本框控件的keyDown事件中加一段保存当前索引值的代码,将光标索引保存到TextIndex中。

3、编写一个循环遍历校验字符串是否存在中文的函数

4、在文本框changed事件中编写控制代码(不要使用循环)。

 

帮你写了个例子,顺便说下,尽量不要用MessageBox弹窗提示,用户体验很差,你可以在状态栏内提示,本例子中没有写弹窗代码,你自己看情况。

 

另外,当更新文本后也会再次触发事件,但是由于我没有采用循环所以不会出现卡顿现象,如果你需要更优化(我这里偷懒了),你可以再加个变量标记用户触发还是程序更新触发,以避免二次触发。

 

int TextIndex = 0;
        //文本框按键按下事件 
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
          TextIndex=  textBox1.SelectionStart;
        } 
       //校验字符串中是否存在中文字符 
       private bool IsChinese(string text)
        {
            if (string.IsNullOrEmpty(text)) return false;
            text = text.Trim();
            foreach (char c in text)
            {
              if (c > 0x80) return true;
            }
            return false;
        }

         //文本框文本改变事件         
          private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string tmp=string.Empty;
            if (IsChinese(textBox1.Text))
            {
             //此处可以写提示代码,略 
         if (TextIndex > 0)//当索引不在左侧,裁剪索引左侧字符串 
                tmp = textBox1.Text.Substring(0, TextIndex);
         //当索引小于文本长度,裁剪右侧字符串,并合并
         if (TextIndex<textBox1.Text.Length) 
            tmp += textBox1.Text.Substring(TextIndex+1, textBox1.Text.Length - TextIndex-1);
            textBox1.Text = tmp;//更新文本框,这里也会造成二次触发事件,但是由于没有循环所以不会出现卡顿现象。

            //恢复光标现场  
            textBox1.SelectionStart = TextIndex;
            textBox1.SelectionLength = 0;
            }
        }
追问
嗯嗯,懂了,一会电脑上,给你追分
百度网友501e361
2015-03-13
知道答主
回答量:25
采纳率:0%
帮助的人:8.5万
展开全部
你for循环的括号呢,,,循环死了
追问
加了也不管用啊
追答
for (int i = textBox1.SelectionStart; i <= textBox1.Text.Length; i++)           //定义i为起始位置
{
if (IsChineseCh(textBox1.Text) == false)
//先弹出MSG提示
MessageBox.Show("你输入的不是汉字");
//然后去掉最后一个字符,设置SelectionStart属性让textbox获得焦点
string strNew = this.textBox1.Text.Substring(0, this.textBox1.Text.Length - 1);
this.textBox1.Text = strNew;
this.textBox1.SelectionStart = this.textBox1.Text.Length;
this.textBox1.Focus();
}
这样不行么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式