2009-09-06 70 views
2

我在vb.net應用程序中有200多個文本框。讓我清楚地說明,所有的都是簡單的文本框。現在客戶要求在輸入或查看記錄時對格式化的數字值進行格式化。使用格式()我可以播放觀看,但在添加/編輯模式中的文本框(雖然用戶鍵入值)什麼也沒有發生 我想要這個結果1234567.0090到1,234,567.0090在輸入過程中。如何在vb.net輸入期間格式化文本框

或引導我通過我改變所有文本框,以掩蓋通過任何工具或代碼的文本框的任何方式。

任何幫助表示讚賞。提前致謝。

+0

使用數字格式的字符。例如,decNo.ToString(「N4」)。 – adatapost 2009-09-06 13:26:54

回答

7

首先,我會推薦非常感謝強烈建議您嘗試與您的客戶談談此需求。一般而言,被掩蓋的文本框對於最終用戶而言都是編程人員的royal royal。在我看來,如果你一定要格式化用戶輸入,那最好是到任何他們已經進入後控件失去焦點,而不是試圖格式化其輸入他們仍然鍵入它的格式。

使用這兩種方法之一,最簡單的方法就是創建自己的用戶控件(除非你想使用第三方控件,我不會建議這樣做的原因有很多),繼承從TextBox(而不是從UserControl繼承)。如果您希望在用戶輸入輸入並移至其他控件後格式化文本,則可以將控件的LostFocus事件添加一個EventHandler,並在其中格式化輸入。

但是,如果您希望在輸入時進行格式化,則會有一些可怕的選擇。首先,您可以處理控件的KeyPress或KeyDown事件,以及攔截和取消非數字字符,或者現在格式化整個Text屬性。這是一種常見的方法,通常會以意想不到的方式失敗,因爲它最終不會處理複製並粘貼到控件中的文本(這經常發生在數據輸入應用程序中)。

的另一種方法是處理TextChanged事件,這將既鍵盤輸入和粘貼式的文字,並重新格式上飛文本作出迴應。由於您經常在輸入時更改文本,因此您的代碼需要關注SelectionStart屬性(等等),以便在用戶輸入時不會意外更改插入符的位置。此外,如果在格式化時更改控件的文本屬性,此更改本身會產生另一個TextChanged事件,因此您需要小心不要陷入無限循環。

要重申我的主要觀點,你會在LostFocus事件更幸福的格式,所以將你的最終用戶。

一旦你寫你的控制,你可以做你的代碼全局替換爲「文本框」(建議在這裏區分大小寫)代以「MyMaskedTextBox」。

更新:下面是一些簡單的解析/格式化代碼,你可以在你的文本框的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將更改爲紅色。這是向用戶指示無效輸入的好方法(與彈出MessageBox相反)。

+0

感謝您的簡短回覆。我遇到了你提到的所有問題。毫無疑問,微軟已經監督了一項非常基本的要求。請建議我在丟失的Foucus事件中設置格式。 – 2009-09-07 05:42:47

+2

「簡答」? :)看到我的代碼示例更新。 – MusiGenesis 2009-09-07 11:59:48

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 
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 
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 

這將在文本框格式號碼爲###。###