朋友的思路:需要把前一次判断成立的内容记录下来,如果下一次改变了,结果是非法的,那么用之前记录的内容将改变后的内容替换掉,当然光标位置也要同时记录,并且替换之后要把之前的光标位置也赋值回去,这样让人感觉仅仅是没有录入进去而已。
我这样写完,一调试,调试失败,程序是可以运行,但不管输什么都弹出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();
}
基本思路是对的,但是你的程序有问题的,先不说你用循环效率低下的问题,主要是当你在循环中修改字符串后,其长度改变了,而for循环是依赖于字符长度的,这样一来会造成循环提前结束,如果输入的字符在尾部问题不大,如果在中间插入,会导致后续字符串会丢失。
而最大问题在于,当你在循环中修改文本后又会触发chage事件,造成多次循环嵌套从而混乱。
另外一个问题,既然使用循环遍历每个字符,就不应该在循环中将整个文本框中的字符串作为参数去校验,造成多余的调用开销;其次,既然遍历所有字符,裁剪字符串时不应该只考虑裁剪尾部字符的情况。
正确的做法是:
1,在当前窗口类中定义一个跟踪光标的索引变量,假设为TextIndex,初始化为0。
2、在文本框控件的keyDown事件中加一段保存当前索引值的代码,将光标索引保存到TextIndex中。
3、编写一个循环遍历校验字符串是否存在中文的函数
4、在文本框changed事件中编写控制代码(不要使用循环)。
帮你写了个例子,顺便说下,尽量不要用MessageBox弹窗提示,用户体验很差,你可以在状态栏内提示,本例子中没有写弹窗代码,你自己看情况。
另外,当更新文本后也会再次触发事件,但是由于我没有采用循环所以不会出现卡顿现象,如果你需要更优化(我这里偷懒了),你可以再加个变量标记用户触发还是程序更新触发,以避免二次触发。
int TextIndex = 0;
嗯嗯,懂了,一会电脑上,给你追分
加了也不管用啊
追答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();
}
这样不行么?