You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多行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

代码说明

  1. 先移除TextChanged事件处理,避免修改文本时递归触发事件导致异常。
  2. 对每行文本进行截断处理,确保不超过70字符。
  3. 限制总行数不超过10行,超出部分直接丢弃。
  4. 将处理后的文本重新赋值给TextBox,并将光标定位到末尾。
  5. 最后重新添加事件处理,恢复正常输入监听。

内容的提问来源于stack exchange,提问作者user23875945

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:13:27