none
实现金额文本框的效果 RRS feed

  • 问题

  • 想实现如题的效果,只允许输入数字、小数点、负号
    并且金额自动用逗号分组,
    必须在输入数字的过程中即实现逗号分组

    应该如何实现,看起来应该不是很难,但是要考虑光标的变化,情况就复杂了很多,要写很长的代码。
    各位有什么简单的实现方法吗?

    谢谢:)
    2009年2月20日 0:37

答案

  • 这是枚举了各种情况,实现的金额文本框。
    代码实在很长,而且这个还未考虑.SelectionLength>0的情况,可能有些地方还是啰嗦了,如果有更好的枚举方式,请高手简化及完善一下

    1 Private Sub Button_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown  
    2         Dim IsNumbers As Boolean = (e.KeyCode >= Keys.D0 And e.KeyCode <= Keys.D9) OrElse (e.KeyValue >= Keys.NumPad0 And e.KeyValue <= Keys.NumPad9)  
    3         Dim IsOperationKeys As Boolean = (e.KeyCode >= Keys.Left And e.KeyCode <= Keys.Down) OrElse _  
    4         (e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Insert OrElse e.KeyCode = Keys.Delete OrElse e.KeyCode = Keys.Home OrElse e.KeyCode = Keys.End OrElse e.KeyCode = Keys.Enter)  
    5         If CType(sender, TextBox).SelectionLength = 0 Then 
    6             Dim TextStr As String = CType(sender, TextBox).Text  
    7             Dim 小数点位置 As Integer = TextStr.IndexOf(".")  
    8             If 小数点位置 = -1 Then 小数点位置 = TextStr.Length : TextStr = TextStr.Insert(小数点位置, ".")  
    9             Dim 光标位置 As Integer = 小数点位置 - CType(sender, TextBox).SelectionStart  
    10             If IsNumbers Or e.KeyCode = Keys.Decimal Or e.KeyCode = Keys.Subtract Then 
    11                 e.SuppressKeyPress = True 
    12                 If IsNumeric(TextStr) Then 
    13                     Select Case e.KeyCode  
    14                         Case Keys.Decimal 
    15                             If 光标位置 = 0 Then 光标位置 = -1  
    16                         Case Keys.Subtract  
    17                         Case Else 
    18                             If CType(sender, TextBox).SelectionStart = 0 Then 
    19                                 If TextStr.Chars(0) = "-"Then 
    20                                 Else 
    21                                     If e.KeyCode <> Keys.D0 AndAlso e.KeyCode <> Keys.NumPad0 Then 
    22                                         TextStr = TextStr.Insert(0, KeyConvert(e.KeyCode))  
    23                                     End If 
    24                                 End If 
    25                             ElseIf CType(sender, TextBox).SelectionStart = 1 Then 
    26                                 If TextStr.Chars(0) = "-"OrElse TextStr.Chars(0) = "0"Then 
    27                                     If e.KeyCode <> Keys.D0 AndAlso e.KeyCode <> Keys.NumPad0 Then 
    28                                         TextStr = TextStr.Insert(1, KeyConvert(e.KeyCode))  
    29                                     End If 
    30                                 Else 
    31                                     TextStr = TextStr.Insert(1, KeyConvert(e.KeyCode))  
    32                                 End If 
    33                             Else 
    34                                 TextStr = TextStr.Insert(小数点位置 - 光标位置, KeyConvert(e.KeyCode))  
    35                                 If 光标位置 < 0 Then 光标位置 = 光标位置 - 1  
    36                             End If 
    37                     End Select 
    38                     CType(sender, TextBox).Text = Strings.Format(Fix(CDec(TextStr.Replace(",""")) * 100) / 100, "#,##0.00")  
    39                     小数点位置 = CType(sender, TextBox).Text.IndexOf(".")  
    40                     光标位置 = 小数点位置 - 光标位置  
    41                     If 光标位置 > CType(sender, TextBox).TextLength Then 
    42                         CType(sender, TextBox).SelectionStart = CType(sender, TextBox).TextLength  
    43                     ElseIf 光标位置 > 0 Then 
    44                         CType(sender, TextBox).SelectionStart = 光标位置  
    45                     Else 
    46                         CType(sender, TextBox).SelectionStart = 0  
    47                     End If 
    48                     CType(sender, TextBox).SelectionLength = 0  
    49                 Else 
    50                     Select Case e.KeyCode  
    51                         Case Keys.Subtract  
    52                         Case Keys.Decimal 
    53                             CType(sender, TextBox).Text = "0.00" : CType(sender, TextBox).SelectionStart = 2  
    54                         Case Else 
    55                             CType(sender, TextBox).Text = KeyConvert(e.KeyCode) & ".00" : CType(sender, TextBox).SelectionStart = 1  
    56                     End Select 
    57                 End If 
    58             ElseIf e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Delete Then 
    59                 e.SuppressKeyPress = True 
    60                 If IsNumeric(TextStr) Then 
    61                     If CType(sender, TextBox).SelectionStart = 0 Then 
    62                         If e.KeyCode = Keys.Delete Then 
    63                             If TextStr.Chars(0) = "-"OrElse TextStr.Chars(0) = "0"Then 
    64                                 光标位置 = 光标位置 - 1  
    65                             Else 
    66                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1) : 光标位置 = 光标位置 - 1  
    67                             End If 
    68                         ElseIf e.KeyCode = Keys.Back Then 
    69                             Exit Sub 
    70                         End If 
    71                     ElseIf CType(sender, TextBox).SelectionStart = 1 Then 
    72                         If e.KeyCode = Keys.Delete Then 
    73                             If (TextStr.Chars(0) = "-"AndAlso TextStr.Chars(1) = "0"c) OrElse TextStr.Chars(0) = "0"Then 
    74                                 光标位置 = 光标位置 - 1  
    75                             Else 
    76                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1) : 光标位置 = 光标位置 - 1  
    77                             End If 
    78                         ElseIf e.KeyCode = Keys.Back Then 
    79                             If TextStr.Chars(0) = "-"Then 
    80                             ElseIf TextStr.Chars(1) = "0"Then 
    81                                 光标位置 = 光标位置 + 1  
    82                             Else 
    83                                 TextStr = TextStr.Remove(小数点位置 - 光标位置 - 1, 1)  
    84                             End If 
    85                         End If 
    86                     Else 
    87                         If e.KeyCode = Keys.Delete Then 
    88                             If TextStr.Chars(小数点位置 - 光标位置) = "."Then 
    89                                 光标位置 = 光标位置 - 1  
    90                             Else 
    91                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1)  
    92                                 If 光标位置 >= 0 Then 光标位置 = 光标位置 - 1  
    93                             End If 
    94                         ElseIf e.KeyCode = Keys.Back Then 
    95                             If TextStr.Chars(小数点位置 - 光标位置 - 1) = "."Then 
    96                                 光标位置 = 光标位置 + 1  
    97                             Else 
    98                                 TextStr = TextStr.Remove(小数点位置 - 光标位置 - 1, 1)  
    99                                 If 光标位置 < 0 Then 光标位置 = 光标位置 + 1  
    100                             End If 
    101                         End If 
    102                     End If 
    103  
    104                     CType(sender, TextBox).Text = Strings.Format(Fix(CDec(TextStr.Replace(",""")) * 100) / 100, "#,##0.00")  
    105                     小数点位置 = CType(sender, TextBox).Text.IndexOf(".")  
    106                     光标位置 = 小数点位置 - 光标位置  
    107                     If 光标位置 > CType(sender, TextBox).TextLength Then 
    108                         CType(sender, TextBox).SelectionStart = CType(sender, TextBox).TextLength  
    109                     ElseIf 光标位置 > 0 Then 
    110                         CType(sender, TextBox).SelectionStart = 光标位置  
    111                     Else 
    112                         CType(sender, TextBox).SelectionStart = 0  
    113                     End If 
    114                     CType(sender, TextBox).SelectionLength = 0  
    115                 End If 
    116             End If 
    117         End If 
    118     End Sub 
    2009年2月22日 1:26

全部回复

  •  

    你发的链接我还要仔细再看看,实际上我已经尝试自己写了代码,集中用了一个KeyDown事件来实现全部效果,但是代码很长,调试起来头很晕。
    我还在考虑能否简化,稍候……:)

    另外,小小的建议论坛能否对帖子提供的链接设计为从新窗口打开,以便后面能继续浏览论坛。
    2009年2月20日 14:27
  • 这是枚举了各种情况,实现的金额文本框。
    代码实在很长,而且这个还未考虑.SelectionLength>0的情况,可能有些地方还是啰嗦了,如果有更好的枚举方式,请高手简化及完善一下

    1 Private Sub Button_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown  
    2         Dim IsNumbers As Boolean = (e.KeyCode >= Keys.D0 And e.KeyCode <= Keys.D9) OrElse (e.KeyValue >= Keys.NumPad0 And e.KeyValue <= Keys.NumPad9)  
    3         Dim IsOperationKeys As Boolean = (e.KeyCode >= Keys.Left And e.KeyCode <= Keys.Down) OrElse _  
    4         (e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Insert OrElse e.KeyCode = Keys.Delete OrElse e.KeyCode = Keys.Home OrElse e.KeyCode = Keys.End OrElse e.KeyCode = Keys.Enter)  
    5         If CType(sender, TextBox).SelectionLength = 0 Then 
    6             Dim TextStr As String = CType(sender, TextBox).Text  
    7             Dim 小数点位置 As Integer = TextStr.IndexOf(".")  
    8             If 小数点位置 = -1 Then 小数点位置 = TextStr.Length : TextStr = TextStr.Insert(小数点位置, ".")  
    9             Dim 光标位置 As Integer = 小数点位置 - CType(sender, TextBox).SelectionStart  
    10             If IsNumbers Or e.KeyCode = Keys.Decimal Or e.KeyCode = Keys.Subtract Then 
    11                 e.SuppressKeyPress = True 
    12                 If IsNumeric(TextStr) Then 
    13                     Select Case e.KeyCode  
    14                         Case Keys.Decimal 
    15                             If 光标位置 = 0 Then 光标位置 = -1  
    16                         Case Keys.Subtract  
    17                         Case Else 
    18                             If CType(sender, TextBox).SelectionStart = 0 Then 
    19                                 If TextStr.Chars(0) = "-"Then 
    20                                 Else 
    21                                     If e.KeyCode <> Keys.D0 AndAlso e.KeyCode <> Keys.NumPad0 Then 
    22                                         TextStr = TextStr.Insert(0, KeyConvert(e.KeyCode))  
    23                                     End If 
    24                                 End If 
    25                             ElseIf CType(sender, TextBox).SelectionStart = 1 Then 
    26                                 If TextStr.Chars(0) = "-"OrElse TextStr.Chars(0) = "0"Then 
    27                                     If e.KeyCode <> Keys.D0 AndAlso e.KeyCode <> Keys.NumPad0 Then 
    28                                         TextStr = TextStr.Insert(1, KeyConvert(e.KeyCode))  
    29                                     End If 
    30                                 Else 
    31                                     TextStr = TextStr.Insert(1, KeyConvert(e.KeyCode))  
    32                                 End If 
    33                             Else 
    34                                 TextStr = TextStr.Insert(小数点位置 - 光标位置, KeyConvert(e.KeyCode))  
    35                                 If 光标位置 < 0 Then 光标位置 = 光标位置 - 1  
    36                             End If 
    37                     End Select 
    38                     CType(sender, TextBox).Text = Strings.Format(Fix(CDec(TextStr.Replace(",""")) * 100) / 100, "#,##0.00")  
    39                     小数点位置 = CType(sender, TextBox).Text.IndexOf(".")  
    40                     光标位置 = 小数点位置 - 光标位置  
    41                     If 光标位置 > CType(sender, TextBox).TextLength Then 
    42                         CType(sender, TextBox).SelectionStart = CType(sender, TextBox).TextLength  
    43                     ElseIf 光标位置 > 0 Then 
    44                         CType(sender, TextBox).SelectionStart = 光标位置  
    45                     Else 
    46                         CType(sender, TextBox).SelectionStart = 0  
    47                     End If 
    48                     CType(sender, TextBox).SelectionLength = 0  
    49                 Else 
    50                     Select Case e.KeyCode  
    51                         Case Keys.Subtract  
    52                         Case Keys.Decimal 
    53                             CType(sender, TextBox).Text = "0.00" : CType(sender, TextBox).SelectionStart = 2  
    54                         Case Else 
    55                             CType(sender, TextBox).Text = KeyConvert(e.KeyCode) & ".00" : CType(sender, TextBox).SelectionStart = 1  
    56                     End Select 
    57                 End If 
    58             ElseIf e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Delete Then 
    59                 e.SuppressKeyPress = True 
    60                 If IsNumeric(TextStr) Then 
    61                     If CType(sender, TextBox).SelectionStart = 0 Then 
    62                         If e.KeyCode = Keys.Delete Then 
    63                             If TextStr.Chars(0) = "-"OrElse TextStr.Chars(0) = "0"Then 
    64                                 光标位置 = 光标位置 - 1  
    65                             Else 
    66                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1) : 光标位置 = 光标位置 - 1  
    67                             End If 
    68                         ElseIf e.KeyCode = Keys.Back Then 
    69                             Exit Sub 
    70                         End If 
    71                     ElseIf CType(sender, TextBox).SelectionStart = 1 Then 
    72                         If e.KeyCode = Keys.Delete Then 
    73                             If (TextStr.Chars(0) = "-"AndAlso TextStr.Chars(1) = "0"c) OrElse TextStr.Chars(0) = "0"Then 
    74                                 光标位置 = 光标位置 - 1  
    75                             Else 
    76                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1) : 光标位置 = 光标位置 - 1  
    77                             End If 
    78                         ElseIf e.KeyCode = Keys.Back Then 
    79                             If TextStr.Chars(0) = "-"Then 
    80                             ElseIf TextStr.Chars(1) = "0"Then 
    81                                 光标位置 = 光标位置 + 1  
    82                             Else 
    83                                 TextStr = TextStr.Remove(小数点位置 - 光标位置 - 1, 1)  
    84                             End If 
    85                         End If 
    86                     Else 
    87                         If e.KeyCode = Keys.Delete Then 
    88                             If TextStr.Chars(小数点位置 - 光标位置) = "."Then 
    89                                 光标位置 = 光标位置 - 1  
    90                             Else 
    91                                 TextStr = TextStr.Remove(小数点位置 - 光标位置, 1)  
    92                                 If 光标位置 >= 0 Then 光标位置 = 光标位置 - 1  
    93                             End If 
    94                         ElseIf e.KeyCode = Keys.Back Then 
    95                             If TextStr.Chars(小数点位置 - 光标位置 - 1) = "."Then 
    96                                 光标位置 = 光标位置 + 1  
    97                             Else 
    98                                 TextStr = TextStr.Remove(小数点位置 - 光标位置 - 1, 1)  
    99                                 If 光标位置 < 0 Then 光标位置 = 光标位置 + 1  
    100                             End If 
    101                         End If 
    102                     End If 
    103  
    104                     CType(sender, TextBox).Text = Strings.Format(Fix(CDec(TextStr.Replace(",""")) * 100) / 100, "#,##0.00")  
    105                     小数点位置 = CType(sender, TextBox).Text.IndexOf(".")  
    106                     光标位置 = 小数点位置 - 光标位置  
    107                     If 光标位置 > CType(sender, TextBox).TextLength Then 
    108                         CType(sender, TextBox).SelectionStart = CType(sender, TextBox).TextLength  
    109                     ElseIf 光标位置 > 0 Then 
    110                         CType(sender, TextBox).SelectionStart = 光标位置  
    111                     Else 
    112                         CType(sender, TextBox).SelectionStart = 0  
    113                     End If 
    114                     CType(sender, TextBox).SelectionLength = 0  
    115                 End If 
    116             End If 
    117         End If 
    118     End Sub 
    2009年2月22日 1:26