多行TextBox粘贴无响应:行字符与行数限制代码修复求助
问题:多行TextBox粘贴功能失效(限每行70字符、最多10行)
现有一段代码用于限制多行TextBox(TextBox24)每行最多70个字符、最多允许10行,正常输入时功能正常,但粘贴文本时文本框无内容显示。
原代码如下:
Private Sub TextBox24_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox24.TextChanged Static txtPrev As String Dim MaxCharsPerLine As Integer = 70 If TextBox24.Lines.GetUpperBound(0) >= 10 Then TextBox24.Text = txtPrev TextBox24.SelectionStart = TextBox24.Text.Length Else For i As Integer = 0 To TextBox24.Lines.GetUpperBound(0) If TextBox24.Lines(i).Length > MaxCharsPerLine Then TextBox24.Text = txtPrev TextBox24.SelectionStart = TextBox24.Text.Length Exit Sub End If Next txtPrev = TextBox24.Text End If End Sub
问题原因
粘贴操作会一次性触发多次TextChanged事件,静态变量txtPrev的更新滞后于文本变化。当粘贴内容直接触发行数超限或单行字符数超限的判断时,代码会将文本重置为txtPrev的初始空值,导致粘贴内容被直接清空。
解决方案
修改逻辑,先对输入(包括粘贴)的文本进行预处理:拆分每行、截断超长行、限制总行数,再将处理后的文本赋值给TextBox,同时避免在TextChanged事件中频繁回滚文本导致的冲突。
修改后的代码:
Private Sub TextBox24_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox24.TextChanged ' 禁用事件避免递归触发 RemoveHandler TextBox24.TextChanged, AddressOf TextBox24_TextChanged Dim MaxCharsPerLine As Integer = 70 Dim MaxLines As Integer = 10 Dim lines As New List(Of String) ' 拆分所有行(包括粘贴的内容) For Each line In TextBox24.Lines ' 截断超长行 Dim processedLine As String = If(line.Length > MaxCharsPerLine, line.Substring(0, MaxCharsPerLine), line) lines.Add(processedLine) ' 达到最大行数就停止添加 If lines.Count >= MaxLines Then Exit For End If Next ' 将处理后的行重新组合 TextBox24.Text = String.Join(Environment.NewLine, lines) ' 保持光标在末尾 TextBox24.SelectionStart = TextBox24.Text.Length ' 重新启用事件 AddHandler TextBox24.TextChanged, AddressOf TextBox24_TextChanged End Sub
代码说明
- 先移除
TextChanged事件处理,避免修改文本时递归触发事件导致异常。 - 对每行文本进行截断处理,确保不超过70字符。
- 限制总行数不超过10行,超出部分直接丢弃。
- 将处理后的文本重新赋值给TextBox,并将光标定位到末尾。
- 最后重新添加事件处理,恢复正常输入监听。
内容的提问来源于stack exchange,提问作者user23875945
相关产品推荐
相关产品推荐

