【问题标题】:textbox multiline, length issues文本框多行,长度问题
【发布时间】:2013-08-26 18:58:11
【问题描述】:

我有一个 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

【问题讨论】:

  • @Mertis,我已经更新了我的代码
  • Lines 是一个数组,因此您的代码将无法工作,因为您检查的是文本框中的行数,而不是单行中的字符数。
  • 你必须想出你自己的代码。检查长度是否符合您的要求并新建一行(例如:SendKeys.Send("{Enter}") 模拟回车)。另请记住,您必须检查 textBox.Width 属性。这是“蹩脚”的方法。一般来说,在对输入文本做更多或更少花哨的事情时,您应该依赖 RichTextBox 控件(允许您做比 TextBox 更多的事情)。更好的方法是使用自己的属性创建自己的文本框。无论如何,没有太多解释,只是写代码。

标签: vb.net winforms textbox


【解决方案1】:

为了有效地处理多行文本,每行最大字符数相同,那么您需要扩展 TextBox 类并覆盖 TextBox 类中的几个项目。我不会重新发明轮子,而是将您从Is there a way to catch maximum length PER LINE and not allow user to input more characters if max length PER LINE has been reached? 的答案重定向到代码,因为它不是公认的答案,我将在下面粘贴 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 拖到表单上并设置属性。

【讨论】:

  • VB.NET 自从我一小时前使用它以来发生了很大变化 :)
  • @varocarbas - :-) 已修复。
  • @Karl Anderson -- 你能帮我把它放到 VB.Net 中吗?
  • 此转换中有几个错误,但您为一个如此简短的问题所做的工作已经绰绰有余:为您 +1。
  • @user1884032 我更改了发布的代码。我通过将Return New From 更改为Return New With 来修复编译错误,但是当光标在第一行时该函数不起作用,因此我替换了 lineLength 算法。 Karl,如果没有必要进行更改,请随时回滚。
猜你喜欢
  • 2017-07-05
  • 2012-08-30
  • 2023-03-23
  • 2010-11-22
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多