回复:(蓝星海)[求助]关于文本框的输入问题,请教错...
我给你一段,
自定义的ValueTextBox控件,它的基本功能:
①、只允许用户输入数字
②、输入的文本会靠右排列,以符合数字的显示惯例
③、用户可以输入负号,当输入负号的位置并非数字的第一码时,自动将负号加在数字的首位
④、可以优化数字,例-000.2优化成-0.2,00045.22优化成45.2
⑤、增加一个公有属性Value,以便设置或返回ValueTextBox中的数值
⑥、当用户输入非负号、数字或是小数点时,自动忽略该输入。
代码者:wjt276
QQ:29248671
E-mail:wjt276@126.com
自定义控件――只接受数字
Public Class ValueTextBox
Inherits System.Windows.Forms.TextBox
#Region " Windows 窗体设计器生成的代码 "
Private mValue As Integer '声明名为mValue和私有字段,以解决秘Text关系。以便访问Value属性值
Private intPiontAsc As Integer
Public Property Value()
Get
mValue = CType(Me.Text, Integer)
Return mValue
End Get
Set(ByVal Value)
mValue = Value
Me.Text = mValue.ToString
End Set
End Property
Private Sub ValueTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
Dim intAscii As Integer
Me.SelectionStart = Me.Text.Length '请输入的数都输入到右边
intAscii = Asc(e.KeyChar) : intPiontAsc = intAscii
Select Case intAscii
Case 48 To 57, 8, 13
'如果输入的是0~9, 退格键或换行键 这是我们允许的按键, 不用做任何事
Case 45
If InStr(Me.Text, "-") <> 0 Then intAscii = 0 ' 如果已经有负号则不允许再输入负号
If Me.SelectionStart <> 0 Then Me.SelectionStart = 0
' 如果负号不是在第一位, 则将负号移至第一位
Case 46
If InStr(Me.Text, ".") <> 0 Then intAscii = 0
Case Else
intAscii = 0
End Select
If intAscii = 0 Then
e.Handled = True ' 如是不合法字元, 则将KeyPressEventArgs的Handled设为True,不用理会
Else
e.Handled = False
End If
End Sub
Private Sub ValueTextBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.TextChanged
Dim string1 As String : Dim string2 As String
If intPiontAsc = 46 Then '对数值型进行优化,如-000.33优化成-0.3,0022.44优化成22.4……
string1 = Me.Text.Substring(0, InStr(Me.Text, ".") - 1) '获取小数点前的所有字符
string2 = CInt(Me.Text.Substring(0, InStr(Me.Text, ".") - 1)) '换成数值型
If string2 = 0 And Me.Text.Substring(0, 1) = "-" Then string2 = "-0"
Me.Text = Me.Text.Replace(string1, string2) '用优化的代替原有的
End If
End Sub
End Class