VB中TextBox输入首字符自动补全-70-后光标错位如何解决
问题根因
- WinForm的
KeyPress事件执行时,用户按下的字符默认会在事件处理完成后自动插入到文本框的光标位置。原代码未将刚输入的S/M加入文本内容,也没有禁用系统默认的插入逻辑,会导致你手动写入-70-后,系统又把输入的首字母插到末尾,出现-70-S的异常。 - 你补充的代码存在语法错误:
temp是你定义的字符串变量,不存在Text和SelectionStart属性,所以逻辑完全不生效。
修复后完整代码
Private Sub TB_Nr_Keypress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TB_Nr.KeyPress ' 放行退格、删除等控制键,不拦截正常编辑操作 If Char.IsControl(e.KeyChar) Then Return End If Dim currentLength As Integer = TB_Nr.Text.Length Try Select Case currentLength Case 0 If e.KeyChar = "S"c OrElse e.KeyChar = "M"c Then ' 手动拼接首字母和固定前缀,直接赋值给文本框 TB_Nr.Text = e.KeyChar & "-70-" ' 光标移到文本末尾方便后续输入 TB_Nr.SelectionStart = TB_Nr.TextLength ' 禁用系统默认插入逻辑,避免重复插入首字母 e.Handled = True Else ' 非法首字符直接拦截 e.Handled = True End If ' X-70-后接5位纯数字,对应文本总长度4到8的位置 Case 4 To 8 If Not Char.IsDigit(e.KeyChar) Then e.Handled = True End If ' 5位数字输完后自动拼接横杠 Case 9 If Char.IsLetterOrDigit(e.KeyChar) Then TB_Nr.Text &= "-" & e.KeyChar TB_Nr.SelectionStart = TB_Nr.TextLength e.Handled = True Else e.Handled = True End If ' 末尾三位仅允许输入字母+数字 Case 10 To 11 If Not Char.IsLetterOrDigit(e.KeyChar) Then e.Handled = True End If ' 超出最大长度直接拦截 Case Else e.Handled = True End Select Catch ex As Exception Console.WriteLine("Fehler") End Try End Sub
核心修改点
- 首字符输入时主动把用户输入的
S/M拼入文本内容,符合X-70-的格式要求 - 文本内容赋值完成后立刻设置
e.Handled = True,阻止系统重复插入用户输入的字符 - 修正了原补充代码中错误操作字符串变量的问题,直接对TextBox控件的属性进行赋值
- 新增控制键放行逻辑,避免用户无法正常删除、退格编辑
内容的提问来源于stack exchange,提问作者J98_2020
相关产品推荐
相关产品推荐

