如何用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();
} 展开
基本思路是对的,但是你的程序有问题的,先不说你用循环效率低下的问题,主要是当你在循环中修改字符串后,其长度改变了,而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;
}
}
嗯嗯,懂了,一会电脑上,给你追分
加了也不管用啊
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();
}
这样不行么?