我在vb.net应用程序中有200多个文本框。让我说清楚所有都是简单的文本框。现在客户要求在输入或查看记录时格式化数值。使用Format()我可以播放观看,但在文本框中添加/编辑模式(用户输入值时)没有任何反应 我希望在输入过程中将此结果1234567.0090改为1,234,567.0090。
或指导我以任何方式更改所有文本框以通过任何工具或代码屏蔽文本框。
任何帮助表示赞赏。在此先感谢。
答案 0 :(得分:7)
首先,我强烈推荐非常您尝试与客户讨论此要求。一般来说,蒙面文本框对于最终用户的程序员和来说都是一种巨大的痛苦。在我看来,如果你一定要格式化用户输入,那最好是格式化无论他们已经进入的之后的控制失去焦点,而不是试图格式化其输入的,而的他们还在打字。
不管采用哪种方法,要做到这一点最简单的方法是创建自己的用户控件(除非您要使用第三方控制,我不会建议用于此目的的一堆原因),从继承TextBox(而不是继承自UserControl)。如果您希望在用户输入完输入后格式化文本并转到另一个控件,则可以将EventHandler添加到控件的LostFocus事件中并在其中格式化输入。
但是,如果您希望在打字时进行格式化,那么您有几个可怕的选择。首先,您可以处理控件的KeyPress或KeyDown事件,以及拦截和取消非数字字符,或者此时格式化整个Text属性。这是一种常见的方法,通常会以意想不到的方式失败,因为它最终不会处理复制并粘贴到控件中的文本(这在数据输入应用程序中经常发生)。
另一种方法是处理TextChanged事件,该事件将响应键盘输入和粘贴的文本,并动态重新格式化文本。由于您经常在键入时更改文本,因此您的代码需要注意SelectionStart属性(以及其他属性),这样您就不会在用户输入时意外更改插入符的位置。此外,当您在格式化时更改控件的文本属性时,此更改本身会产生另一个TextChanged事件,因此您需要注意不要陷入无限循环。
重申我的主要观点,你将在LostFocus活动中更加快乐地进行格式化,最终用户也将如此。
一旦编写了控件,就可以在代码中进行全局替换,将“MyMaskedTextBox”替换为“TextBox”(此处建议使用区分大小写)。
更新:以下是您可以在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;
}
如果输入的文本可以解析为double,则此代码将以您需要的方式将用户输入格式化为数字。如果输入不是有效的double,则文本保持原样,BackColor更改为红色。这是向用户指示无效输入的好方法(而不是弹出MessageBox)。
答案 1 :(得分:0)
在文本框派生的自定义控件中覆盖这些事件。但是,请记住他们打字时没有格式化,
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
答案 2 :(得分:0)
这是另一种方法。
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
答案 3 :(得分:0)
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
这会将文本框中的数字格式化为###。###