VB.NET TextBox控件如何通过字节长度限制输入(高手麻烦抽空看一看)

时间:2023-01-24 14:12:28
TextBox本身的MaxLength属性是字符长度的限制。不能验证字节。如何实现字节长度的限制,
要考虑CTRL+V和鼠标右键的粘贴。  

11 个解决方案

#1


Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

#2


引用 1 楼 forcyever 的回复:
Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

我现在就是在采取截取的方式。会有以下的BUG
比如:文本中的内容是“一二三一”    字节长度是8的情况下,粘贴板的内容是“一二三四” 如果我选中内容中文“二”在CTRL+V或者鼠标右键粘贴的时候 ,内容就会变成了 “一一二三”

#3


引用 1 楼 forcyever 的回复:
Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

内容应该是“一一三一”才对 没有办法校验CTRL+V 和鼠标右键 在TextChanged事件里面 文本都已经改变了 长度都超过了。然后在截取 就会变成上面的情况  “一一二三”.  我是VB.NET 新手 不会重新写自定义的控件。网上找了一个C#重写TextBOX 字节长度限制的方式 但是不会转换成VB.NET的

#4


http://blog.csdn.net/vio4677/article/details/7951639

这个是C# Textbox 限制输入长度的方式。 重写了 CTRL+V 和 鼠标右键的粘贴  哪位VB高手看看这个能转换成VB.NET的自定义控件吗?

#5


那你直接就是达到长度限制了,直接设置text为只读

#6


引用 5 楼 forcyever 的回复:
那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

#7


引用 6 楼 QuanMiMang 的回复:
Quote: 引用 5 楼 forcyever 的回复:

那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

keydown事件判断,回车或者删除就将只读取消

#8


引用 7 楼 forcyever 的回复:
Quote: 引用 6 楼 QuanMiMang 的回复:

Quote: 引用 5 楼 forcyever 的回复:

那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

keydown事件判断,回车或者删除就将只读取消

keyPress 和keydown 没有办法校验 鼠标右键时候的粘贴功能。 文本截取的方式会出现上面提到过的问题

#9


帮你转化过来:vb2010代码如下:请查收。

Public Class uTextBox
    Inherits System.Windows.Forms.TextBox

    Public Property MaxByteLength As UInteger

    Private Const WM_PASTEDATA As Integer = &H302     ' //貼上資料的訊息
    Private Const WM_CHAR As Integer = &H102

    Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
        MyBase.OnKeyPress(e)
        If Me.ReadOnly Then Return '//唯讀不處理
        If (_MaxByteLength = 0) Then Return '//沒設定MaxByteLength不處理
        If (Char.IsControl(e.KeyChar)) Then Return ' //Backspace, Enter...等控制鍵不處理
        Dim textByteLength As Integer = System.Text.Encoding.GetEncoding(950).GetByteCount(Text + e.KeyChar.ToString()) '//取得原本字串和新字串相加後的Byte長度
        Dim selectTextByteLength As Integer = System.Text.Encoding.GetEncoding(950).GetByteCount(SelectedText) '//取得選取字串的Byte長度, 選取字串將會被取代
        If (textByteLength - selectTextByteLength > _MaxByteLength) Then e.Handled = True ' //相減後長度若大於設定值, 則不送出該字元
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_PASTEDATA Then '//如果收到貼上資料的訊息, 包括Ctrl+V, Shift+Ins和滑鼠右鍵選單中的貼上
            Me.SendCharFromClipboard()  '//就把剪貼簿中的字串一個字元一個字元的拆開, 再傳給自己  SendCharFromClipboard()
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Private Sub SendCharFromClipboard()
        For Each c As Char In Clipboard.GetText()
            Dim msg As Message = New Message()
            msg.HWnd = Handle
            msg.Msg = WM_CHAR
            msg.WParam = CType(Asc(c), IntPtr)
            msg.LParam = IntPtr.Zero
            MyBase.WndProc(msg)
        Next
    End Sub

End Class

#10


一节一般和你保存的编码有直接关系,如ANSI的英文字符算2位,utf-8都是以4位来存储,所以你首要条件是确认是哪种编码

#11


定义控件的MaxByteLength=14:输入中文字最多只能输入7个。
VB.NET TextBox控件如何通过字节长度限制输入(高手麻烦抽空看一看)

#1


Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

#2


引用 1 楼 forcyever 的回复:
Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

我现在就是在采取截取的方式。会有以下的BUG
比如:文本中的内容是“一二三一”    字节长度是8的情况下,粘贴板的内容是“一二三四” 如果我选中内容中文“二”在CTRL+V或者鼠标右键粘贴的时候 ,内容就会变成了 “一一二三”

#3


引用 1 楼 forcyever 的回复:
Lenb(StrConv("大", vbFromUnicode))//此处为2
在textchange事件里面判断textbox内容长度,超过长度就截取,判断下最后一位是不是汉字,另作处理。

内容应该是“一一三一”才对 没有办法校验CTRL+V 和鼠标右键 在TextChanged事件里面 文本都已经改变了 长度都超过了。然后在截取 就会变成上面的情况  “一一二三”.  我是VB.NET 新手 不会重新写自定义的控件。网上找了一个C#重写TextBOX 字节长度限制的方式 但是不会转换成VB.NET的

#4


http://blog.csdn.net/vio4677/article/details/7951639

这个是C# Textbox 限制输入长度的方式。 重写了 CTRL+V 和 鼠标右键的粘贴  哪位VB高手看看这个能转换成VB.NET的自定义控件吗?

#5


那你直接就是达到长度限制了,直接设置text为只读

#6


引用 5 楼 forcyever 的回复:
那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

#7


引用 6 楼 QuanMiMang 的回复:
Quote: 引用 5 楼 forcyever 的回复:

那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

keydown事件判断,回车或者删除就将只读取消

#8


引用 7 楼 forcyever 的回复:
Quote: 引用 6 楼 QuanMiMang 的回复:

Quote: 引用 5 楼 forcyever 的回复:

那你直接就是达到长度限制了,直接设置text为只读

长度虽然达到了,但是还需要选中其中的某段文本进行修改替换。

keydown事件判断,回车或者删除就将只读取消

keyPress 和keydown 没有办法校验 鼠标右键时候的粘贴功能。 文本截取的方式会出现上面提到过的问题

#9


帮你转化过来:vb2010代码如下:请查收。

Public Class uTextBox
    Inherits System.Windows.Forms.TextBox

    Public Property MaxByteLength As UInteger

    Private Const WM_PASTEDATA As Integer = &H302     ' //貼上資料的訊息
    Private Const WM_CHAR As Integer = &H102

    Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
        MyBase.OnKeyPress(e)
        If Me.ReadOnly Then Return '//唯讀不處理
        If (_MaxByteLength = 0) Then Return '//沒設定MaxByteLength不處理
        If (Char.IsControl(e.KeyChar)) Then Return ' //Backspace, Enter...等控制鍵不處理
        Dim textByteLength As Integer = System.Text.Encoding.GetEncoding(950).GetByteCount(Text + e.KeyChar.ToString()) '//取得原本字串和新字串相加後的Byte長度
        Dim selectTextByteLength As Integer = System.Text.Encoding.GetEncoding(950).GetByteCount(SelectedText) '//取得選取字串的Byte長度, 選取字串將會被取代
        If (textByteLength - selectTextByteLength > _MaxByteLength) Then e.Handled = True ' //相減後長度若大於設定值, 則不送出該字元
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_PASTEDATA Then '//如果收到貼上資料的訊息, 包括Ctrl+V, Shift+Ins和滑鼠右鍵選單中的貼上
            Me.SendCharFromClipboard()  '//就把剪貼簿中的字串一個字元一個字元的拆開, 再傳給自己  SendCharFromClipboard()
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Private Sub SendCharFromClipboard()
        For Each c As Char In Clipboard.GetText()
            Dim msg As Message = New Message()
            msg.HWnd = Handle
            msg.Msg = WM_CHAR
            msg.WParam = CType(Asc(c), IntPtr)
            msg.LParam = IntPtr.Zero
            MyBase.WndProc(msg)
        Next
    End Sub

End Class

#10


一节一般和你保存的编码有直接关系,如ANSI的英文字符算2位,utf-8都是以4位来存储,所以你首要条件是确认是哪种编码

#11


定义控件的MaxByteLength=14:输入中文字最多只能输入7个。
VB.NET TextBox控件如何通过字节长度限制输入(高手麻烦抽空看一看)