如何判断Textbox里的字节数

时间:2023-01-11 19:00:09
我已经通过textbox的textlength来控制textbox的字节数一旦达到49个的时候,就做出程序反应(主要是刚好textbox字输到刚好可以看到的位置,不会继续往下输而使前面的字看不到了,但是我后来又发现如果我换用英文输的话,结果还有好大一段空白就玩完了,原来英文的字节数要小很多,但是字的个数居然又和中文一样,现在想改用字节数来控制,请问怎么判断Textbox里的字节数多少。

34 个解决方案

#1


我顶。

#2


Convert.ToByte

#3


system.text.encoding.ascii.getbytecount("text")

#4


同意楼上,转成字节来判断

#5


怎么转,你们写的也太简单了吧,这些代码都写在程序的什么位置。这么一句扔给我,我晕死。你这么一段代码我怎么用啊。

#6


qzj(SoldierQ) 不是写得很清楚了吗?把“text”换成你的要的textbox的text不旧可以了?

#7


他写的是错的,我现在是这样写的:

If System.Text.Encoding.ASCII.GetByteCount("" & TextBoxWkPro1.Text & "") >= 49 Then

……

结果,我的文本框还是这样,可以输49个汉字,49个英文,照理说应该输98个英文,这样才能刚好
把文本框输满。问题还没有解决。大家先别走。

#8


顶,看来没有闵锋就是不行啊。

#9


这个应该可以达到你的要求!
Dim enc As Encoding = Encoding.Default
Dim us As String = TextBox1.Text
Dim arr As Byte() = enc.GetBytes(us)
if arr.Length>=49 then
…………
endif

#10


dim count as integer = system.text.encoding.default.getbytecount(me.textbox1.text)
if count>49 then
 '操作
end if
--------------------------

#11


tl_pear(飘叶寻梦),谢谢你,你说的很对,
那如何设置textbox的最大值吗,就是maxlength,我想是输入98个字节后就不允许再输入了。除非删除前面的字符,如何控制。

#12


hamadou(闵峰),你也发表下。

#13


写错了!
dim count as integer = system.text.encoding.default.getbytecount(me.textbox1.text)
if count>98 then
 '操作
end if

#14


好的,继续,如何控制textbox的maxlength呢

#15


回答完这个我就散分了,不好意思,没有问清楚。就这一步了。麻烦各位高手了。

#16


我覺得關鍵最後樓主是想得到什麼編碼的字串,如果最終樓主得到的字串都是Unicode的話,無認是’a’,還是’中’,不都是2個字節的嗎?甚而UTF8,UTF16等都會不一樣的.

#17


其实,如果要控制输入,可以在textbox控件的textchange里用上面的内容来判断,做一个函数,返回值是一个布尔值,如果达到了98个就为true,否则为false,发现它为true的话就立即设置最大宽度为现在的长度。
或者在keypress里调用这个函数,如果为真,则handle = ture

#18


同意楼上的!
textbox有一个maxlength属性,不过它是按字符的。
所以,你如果要按字节来判断的话,可以在textchange事件里去控制。

#19


控制不住,我在change事件里也做了,在keypress事件里也做了控制,发现可以控制中文字符,因为我们打中文的时候,不是马上就输进去的,是想跳出字符框让我们选汉字,所以keypress可以控制住,而输入数字和字母的时候,由于是一下就输进去的,所以控制不住,还是能被输进去。大家可以自己试下。

#20


我的代码是:
If arr.Length >= 98 Then
            TextBoxWkPro1.MaxLength = arr.Length
            TextBoxWkPro2.Focus()
        End If

#21


注意:这里以10来模拟了最大的输入数字,也就是98
Public Function checkboolean() As Boolean
        Dim count As Integer = System.Text.Encoding.Default.GetByteCount(Me.TextBox1.Text)
        If count >= 10 Then
            m = Me.TextBox1.Text.Length
            Return True
        Else
            Return False
        End If

    End Function



 Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If checkboolean() Then
            Me.TextBox1.MaxLength = m
        Else
            Me.TextBox1.MaxLength = 10
        End If
    End Sub

#22


闵峰真乃vb.net网友之福,CSDN之福啊。现在基本上已经解决了,不过就差一个问题,就是如果最后只剩下一个字符空间给我输了,我不输,我才用复制粘贴,这样就无论多少个字符都能贴上去了。怎么办,我现在想到个解决的办法,可惜我代码不会写,因为对vb.net的代码实在是不熟悉。谢谢各位帮忙。我的思路是这样的:
就是当文本框接收字符输入时就采用检测法,一但检测到超过98个字符,那么就自动把第98个字符之后的字符全自动删除,这样代码怎么实现。

#23


就是在textchange事件里写。

#24


Dim enc As Encoding = Encoding.Default
Dim us As String = TextBox1.Text
Dim arr As Byte() = enc.GetBytes(us)

if arr.Length>=49 then
’只取前49个
textbox1.text=""
for i=0 to 49
textbox1.text=textbox1.text+CStr(arr.GetValue(i))  
next
end if

#25


被搞死机了,飘叶寻梦有点强。不行的说。

#26


写了一个用户控件,可以达到复制和输入的控制。
Public Class maxtextbox
    Inherits System.Windows.Forms.TextBox

#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    'UserControl 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意:以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
    End Sub

#End Region
    Private h As Integer
    Private m_max As Integer = 10
    Public Property mlength() As Integer
        Get
            Return m_max
        End Get
        Set(ByVal Value As Integer)
            If Value >= 1 Then
                m_max = Value
            End If
        End Set
    End Property
    Public Function checkboolean() As Boolean
        Dim count As Integer = System.Text.Encoding.Default.GetByteCount(Me.Text)
        If count >= 10 Then
            h = Me.Text.Length
            Return True
        Else
            Return False
        End If
    End Function

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim KeyAsc As Integer = m.WParam.ToInt32
        Select Case m.Msg
            Case &H102    '按键
                If checkboolean() Then
                    Me.MaxLength = h
                Else
                    Me.MaxLength = m_max
                End If
            Case &H302    '复制
                If checkboolean() Then
                    Return
                End If
        End Select
        MyBase.WndProc(m)
    End Sub
End Class
-----------------------------另外:还有了,wudiccj(软件黄牛) 兄,以后不要说什么“没有闵峰不行”之类的话了,因为看了真的很惭愧。因为不是很忙,所以偷着来这里看,等以后忙了,估计会来的少些。最主要的是我还没有那么高的水平,真的,这不是谦虚,我自己了解我自己。希望我们都可以在这里互相帮助相互学习!加油哦!楼主!

#27


hamadou(闵峰) 兄果然厉害,
方法比我的高明多了!

#28


谢谢,怎么用,控件怎么添加到工具栏里

#29


在你的项目里直接添加“用户控件”--》在名字里输入“maxtextbox”,然后将上面的代码粘贴进去,生成,在工具栏的最下面就会发现该控件了。以后想在其他的项目里使用,在工具栏里点右键,“自定义工具栏”,选择com选项卡,然后找到相应的dll文件(你需要给它添加到一个组件类里)在需要的控件前的复选框打勾即可。

#30


我也是在工作,有空就上来看看,不过大家的问题好难,都不会解,,,哈哈哈。

#31


都搞好了,就是不知道怎么生成用户控件,代码也写进去了。生成按扭在哪里啊。

#32


“生成”菜单 -》“生成你的项目名”

#33


那么复杂不能用LEN吗?

#34


f

#1


我顶。

#2


Convert.ToByte

#3


system.text.encoding.ascii.getbytecount("text")

#4


同意楼上,转成字节来判断

#5


怎么转,你们写的也太简单了吧,这些代码都写在程序的什么位置。这么一句扔给我,我晕死。你这么一段代码我怎么用啊。

#6


qzj(SoldierQ) 不是写得很清楚了吗?把“text”换成你的要的textbox的text不旧可以了?

#7


他写的是错的,我现在是这样写的:

If System.Text.Encoding.ASCII.GetByteCount("" & TextBoxWkPro1.Text & "") >= 49 Then

……

结果,我的文本框还是这样,可以输49个汉字,49个英文,照理说应该输98个英文,这样才能刚好
把文本框输满。问题还没有解决。大家先别走。

#8


顶,看来没有闵锋就是不行啊。

#9


这个应该可以达到你的要求!
Dim enc As Encoding = Encoding.Default
Dim us As String = TextBox1.Text
Dim arr As Byte() = enc.GetBytes(us)
if arr.Length>=49 then
…………
endif

#10


dim count as integer = system.text.encoding.default.getbytecount(me.textbox1.text)
if count>49 then
 '操作
end if
--------------------------

#11


tl_pear(飘叶寻梦),谢谢你,你说的很对,
那如何设置textbox的最大值吗,就是maxlength,我想是输入98个字节后就不允许再输入了。除非删除前面的字符,如何控制。

#12


hamadou(闵峰),你也发表下。

#13


写错了!
dim count as integer = system.text.encoding.default.getbytecount(me.textbox1.text)
if count>98 then
 '操作
end if

#14


好的,继续,如何控制textbox的maxlength呢

#15


回答完这个我就散分了,不好意思,没有问清楚。就这一步了。麻烦各位高手了。

#16


我覺得關鍵最後樓主是想得到什麼編碼的字串,如果最終樓主得到的字串都是Unicode的話,無認是’a’,還是’中’,不都是2個字節的嗎?甚而UTF8,UTF16等都會不一樣的.

#17


其实,如果要控制输入,可以在textbox控件的textchange里用上面的内容来判断,做一个函数,返回值是一个布尔值,如果达到了98个就为true,否则为false,发现它为true的话就立即设置最大宽度为现在的长度。
或者在keypress里调用这个函数,如果为真,则handle = ture

#18


同意楼上的!
textbox有一个maxlength属性,不过它是按字符的。
所以,你如果要按字节来判断的话,可以在textchange事件里去控制。

#19


控制不住,我在change事件里也做了,在keypress事件里也做了控制,发现可以控制中文字符,因为我们打中文的时候,不是马上就输进去的,是想跳出字符框让我们选汉字,所以keypress可以控制住,而输入数字和字母的时候,由于是一下就输进去的,所以控制不住,还是能被输进去。大家可以自己试下。

#20


我的代码是:
If arr.Length >= 98 Then
            TextBoxWkPro1.MaxLength = arr.Length
            TextBoxWkPro2.Focus()
        End If

#21


注意:这里以10来模拟了最大的输入数字,也就是98
Public Function checkboolean() As Boolean
        Dim count As Integer = System.Text.Encoding.Default.GetByteCount(Me.TextBox1.Text)
        If count >= 10 Then
            m = Me.TextBox1.Text.Length
            Return True
        Else
            Return False
        End If

    End Function



 Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If checkboolean() Then
            Me.TextBox1.MaxLength = m
        Else
            Me.TextBox1.MaxLength = 10
        End If
    End Sub

#22


闵峰真乃vb.net网友之福,CSDN之福啊。现在基本上已经解决了,不过就差一个问题,就是如果最后只剩下一个字符空间给我输了,我不输,我才用复制粘贴,这样就无论多少个字符都能贴上去了。怎么办,我现在想到个解决的办法,可惜我代码不会写,因为对vb.net的代码实在是不熟悉。谢谢各位帮忙。我的思路是这样的:
就是当文本框接收字符输入时就采用检测法,一但检测到超过98个字符,那么就自动把第98个字符之后的字符全自动删除,这样代码怎么实现。

#23


就是在textchange事件里写。

#24


Dim enc As Encoding = Encoding.Default
Dim us As String = TextBox1.Text
Dim arr As Byte() = enc.GetBytes(us)

if arr.Length>=49 then
’只取前49个
textbox1.text=""
for i=0 to 49
textbox1.text=textbox1.text+CStr(arr.GetValue(i))  
next
end if

#25


被搞死机了,飘叶寻梦有点强。不行的说。

#26


写了一个用户控件,可以达到复制和输入的控制。
Public Class maxtextbox
    Inherits System.Windows.Forms.TextBox

#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    'UserControl 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意:以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
    End Sub

#End Region
    Private h As Integer
    Private m_max As Integer = 10
    Public Property mlength() As Integer
        Get
            Return m_max
        End Get
        Set(ByVal Value As Integer)
            If Value >= 1 Then
                m_max = Value
            End If
        End Set
    End Property
    Public Function checkboolean() As Boolean
        Dim count As Integer = System.Text.Encoding.Default.GetByteCount(Me.Text)
        If count >= 10 Then
            h = Me.Text.Length
            Return True
        Else
            Return False
        End If
    End Function

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim KeyAsc As Integer = m.WParam.ToInt32
        Select Case m.Msg
            Case &H102    '按键
                If checkboolean() Then
                    Me.MaxLength = h
                Else
                    Me.MaxLength = m_max
                End If
            Case &H302    '复制
                If checkboolean() Then
                    Return
                End If
        End Select
        MyBase.WndProc(m)
    End Sub
End Class
-----------------------------另外:还有了,wudiccj(软件黄牛) 兄,以后不要说什么“没有闵峰不行”之类的话了,因为看了真的很惭愧。因为不是很忙,所以偷着来这里看,等以后忙了,估计会来的少些。最主要的是我还没有那么高的水平,真的,这不是谦虚,我自己了解我自己。希望我们都可以在这里互相帮助相互学习!加油哦!楼主!

#27


hamadou(闵峰) 兄果然厉害,
方法比我的高明多了!

#28


谢谢,怎么用,控件怎么添加到工具栏里

#29


在你的项目里直接添加“用户控件”--》在名字里输入“maxtextbox”,然后将上面的代码粘贴进去,生成,在工具栏的最下面就会发现该控件了。以后想在其他的项目里使用,在工具栏里点右键,“自定义工具栏”,选择com选项卡,然后找到相应的dll文件(你需要给它添加到一个组件类里)在需要的控件前的复选框打勾即可。

#30


我也是在工作,有空就上来看看,不过大家的问题好难,都不会解,,,哈哈哈。

#31


都搞好了,就是不知道怎么生成用户控件,代码也写进去了。生成按扭在哪里啊。

#32


“生成”菜单 -》“生成你的项目名”

#33


那么复杂不能用LEN吗?

#34


f