1

我有一个textbox设置multiline为true。我想将每行max characters设置为50总共 3 行。当他们达到 50 个字符时,我希望它跳到第二行。我遇到了一些问题,并且已经为此苦苦挣扎了一段时间,想知道是否有人可以提供帮助。

MAX_LINE_COUNT = 3

Private Sub txtMsg_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtMsg.KeyDown

    If e.KeyCode = Keys.Enter Then
        e.SuppressKeyPress = (Me.txtMsg.Lines.Length >= MAX_LINE_COUNT)
    End If

End Sub
4

1 回答 1

2

为了有效地处理每行具有共同最大字符数的多行文本,您将需要扩展TextBox该类并覆盖该类中的多个项目TextBox。我不会重新发明轮子,而是将您从答案重定向到代码Is there a way to catch maximum length PER LINE and not allow user input more characters if max length PER LINE已达到?,由于它不是公认的答案,我将在下面粘贴 VB.NET 翻译:

Public Class MaxPerLineTextBox
  Inherits TextBox
  Public Sub New()
    MyBase.Multiline = True
  End Sub

  Public Overrides Property Multiline() As Boolean
    Get
      Return True
    End Get
    Set
      Throw New InvalidOperationException("Readonly subclass")
    End Set
  End Property

  Public Property MaxPerLine() As System.Nullable(Of Integer)
    Get
      Return m_MaxPerLine
    End Get
    Set
      m_MaxPerLine = Value
    End Set

  End Property

  Private m_MaxPerLine As System.Nullable(Of Integer)

  Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
    If Char.IsControl(e.KeyChar) Then
      MyBase.OnKeyPress(e)
      Return
    End If

    Dim maxPerLine As Integer
    If Me.MaxPerLine.HasValue Then
      maxPerLine = Me.MaxPerLine.Value
    Else
      MyBase.OnKeyPress(e)
      Return
    End If

    Dim activeLine As Integer = Me.GetLineFromCharIndex(Me.SelectionStart)
    Dim lineLength As Integer = Me.SelectionStart - Me.GetFirstCharIndexFromLine(activeLine)

    If lineLength < maxPerLine Then
      MyBase.OnKeyPress(e)
      Return
    End If

    e.Handled = True
  End Sub
End Class

要使用上述代码,您需要执行以下操作:

  1. 在您的解决方案中创建一个新项目来保存上面的代码。
  2. 将上面的代码粘贴到新项目中并构建它。
  3. 确保没有错误并且项目编译成功。
  4. MaxPerLineTextBox 控件应显示在工具箱中。如果没有,请尝试重新启动 Visual Studio。
  5. 将 MaxPerLineTextBox 拖到表单上并设置属性。
于 2013-08-26T19:44:41.720 回答