TextBox的TextChanged事件中复杂if条件判断设置问题
解决TextBox TextChanged事件中的复杂格式验证问题
我完全懂你碰到的坑——用IndexOf()判断前三位确实容易掉链子,因为它只查字符串里有没有目标子串,而非确保前三位精准匹配;另外直接用Convert.ToInt32()也没考虑输入非数字的情况,很容易炸出异常。下面给你一套稳当的验证逻辑:
核心验证思路
先确保输入长度达标,再逐位精准校验,最后安全转换数字区间,全程避免异常崩溃:
完整代码示例(以WinForms为例)
private void textBox1_TextChanged(object sender, EventArgs e) { string input = textBox1.Text.Trim(); // 先清掉首尾空格,避免干扰判断 // 第一步:先检查输入长度至少9位(要用到索引0-8,长度不够直接跳过) if (input.Length < 9) { return; } // 第二步:精准验证前三位是S、E、H bool isPrefixValid = input[0] == 'S' && input[1] == 'E' && input[2] == 'H'; if (!isPrefixValid) { return; } // 第三步:验证第8位(索引8)是H或R bool is8thCharValid = input[8] == 'H' || input[8] == 'R'; if (!is8thCharValid) { return; } // 第四步:安全验证第4-7位是0-3000的数字 string numSegment = input.Substring(4, 4); // 从索引4开始取4个字符 if (int.TryParse(numSegment, out int numValue)) { // 转换成功后再判断数字区间 if (numValue >= 0 && numValue <= 3000) { // 所有条件满足,调用你的PDF加载方法 LoadYourPDF(); } } }
关键问题拆解
为啥抛弃IndexOf?
IndexOf("SEH")只会返回子串在输入里的首个起始位置,比如输入是"XSEH1234H"时,它会返回1,但此时前三位是X、S、E,完全不符合要求。直接按索引取input[0]/input[1]/input[2]判断,才能确保前三位精准匹配。为啥用int.TryParse?
如果第4-7位是字母、符号这类非数字内容,Convert.ToInt32()会直接抛出异常搞崩程序。int.TryParse()会安全尝试转换,失败时返回false,不会影响程序正常运行。为啥先检查长度?
如果输入长度不足9位,直接访问input[8]或调用Substring(4,4)会触发ArgumentOutOfRangeException,先判断长度能提前规避这类低级异常。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

