【问题标题】:how to format text box during input in vb.net如何在vb.net中输入时格式化文本框
【发布时间】:2017-02-10 00:38:23
【问题描述】:

我在 vb.net 应用程序中有 200 多个文本框。让我说清楚,所有这些都是简单的文本框。现在客户要求在输入或查看记录时具有格式化的数值。使用 Format() 我可以播放查看,但在文本框中的添加/编辑模式下(当用户输入值时)什么也没发生 我希望在输入期间将这个结果从 1234567.0090 变为 1,234,567.0090。

或指导我通过任何工具或代码更改所有文本框以屏蔽文本框。

任何帮助表示赞赏。提前致谢。

【问题讨论】:

  • 使用数字格式字符。例如,decNo.ToString("N4").

标签: vb.net


【解决方案1】:

首先,我强烈非常建议您尝试说服您的客户放弃此要求。对于程序员的最终用户来说,蒙面文本框通常是一件非常痛苦的事情。在我看来,如果您必须格式化用户输入,那么在控件失去焦点后 格式化他们输入的任何内容要比尝试格式化他们的输入 要好得多。还在打字。

无论采用哪种方法,最简单的方法是创建您自己的用户控件(除非您想使用第三方控件,出于多种原因我不建议为此目的),该控件继承自TextBox(而不是从 UserControl 继承)。如果您希望在用户完成输入并移至另一个控件后格式化文本,您可以在控件的 LostFocus 事件中添加一个 EventHandler 并在那里格式化他们的输入。

但是,如果您希望在他们键入时进行格式化,那么您有几个可怕的选择。首先,您可以处理控件的 KeyPress 或 KeyDown 事件,并截取并取消非数字字符,或者此时格式化整个 Text 属性。这是一种常见的方法,但通常会以意想不到的方式失败,因为它最终不会处理复制并粘贴到控件中的文本(这在数据输入应用程序中经常发生)。

另一种方法是处理 TextChanged 事件,该事件将响应键盘输入和粘贴的文本,并即时重新格式化文本。由于您经常在键入文本时更改文本,因此您的代码需要注意 SelectionStart 属性(以及其他属性),以免在用户键入时意外更改插入符号的位置。此外,当您在格式化时更改控件的文本属性时,此更改本身会产生另一个 TextChanged 事件,因此您需要注意不要陷入无限循环。

重申我的主要观点,在 LostFocus 事件中格式化会更开心,最终用户也会如此。

编写控件后,只需在代码中进行全局替换,将“TextBox”替换为“MyMaskedTextBox”(此处建议区分大小写)。

更新:这里有一些简单的解析/格式化代码,您可以在 TextBox 的 LostFocus 事件中使用:

double d;
TextBox tb = (TextBox)sender;
if (double.TryParse(tb.Text, out d))
{
    tb.Text = d.ToString("#,###,###,###.0000");
    tb.BackColor = SystemColors.Window;
}
else
{
    tb.BackColor = Color.Red;
}

如果输入的文本可以解析为双精度,则此代码将按照您需要的方式将用户的输入格式化为数字。如果输入不是有效的双精度,则文本保持原样,BackColor 更改为红色。这是向用户指示无效输入的好方法(与弹出消息框相反)。

【讨论】:

  • 感谢您的简短回复。我遇到了你提到的所有问题。毫无疑问,微软监督了一个非常基本的要求。请建议我格式化丢失焦点事件的代码。
【解决方案2】:

在您的文本框派生的自定义控件中覆盖这些事件。但是,请记住在他们输入时不要格式化,

Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
    MyBase.OnLostFocus(e) 
    Me.Text = Strings.FormatNumber(Me.Text, _
                                      m_FormatNumDigitsAfterDecimal, _
                                      m_FormatIncludeLeadingDigit, _
                                      m_FormatUseParensForNegativeNumbers, _
                                      m_FormatGroupDigits)
End Sub
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
    MyBase.OnTextChanged(e)
    If Me.Focused = False Then
        Me.Text = Strings.FormatNumber(Me.Text, _
                                       m_FormatNumDigitsAfterDecimal, _
                                       m_FormatIncludeLeadingDigit, _
                                       m_FormatUseParensForNegativeNumbers, _
                                       m_FormatGroupDigits)
    End If
End Sub

【讨论】:

    【解决方案3】:

    这是另一种方法。

    Private Sub TBItemValor_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TBItemValor.KeyPress
            If (Char.IsDigit(e.KeyChar) = False AndAlso Char.IsControl(e.KeyChar) = False AndAlso Char.IsPunctuation(e.KeyChar) = False) OrElse Not IsNumeric(Me.TBItemValor.Text & e.KeyChar) Then
                e.Handled = True
            End If
        End Sub
    

    【讨论】:

      【解决方案4】:
      Public Sub checktextbox2(txt As TextBox)
      dim bg as string
      For t = 1 To txt.Text.Length
              If txt.Text.Chars(txt.Text.Length - (txt.Text.Length - t)) = "." Then
                  bq = txt.Text.TrimEnd(New String({"0", "."}))
                  txt.Text = bq
                  Exit For
              End If
          Next
      end sub
      

      这会将文本框中的数字格式化为###.###

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多