Snippet

TextBox na měnu

Přidáno: 10.9.2007       Kategorie: VB.NET - Komponenty       Autor: Tomáš Herceg

Občas je třeba v aplikacích zadávat měnu a umožnit ji uživatelům nějak pohodlně editovat.
Pokud si do projektu přidáte novou třídu a vložíte do ní tento kód, dostanete jednoduchou komponentu CurrencyTextBox. Nejde o nic jiného než o vylepšený TextBox. Hodnota je zarovnána doprava a místo samotné nuly se v něm zobrazí 0,0 Kč. V okamžiku, kdy chceme hodnotu upravit, se v textovém poli objeví pouze samotné číslo zarovnané vlevo. Jakmile editaci ukončíme, nová hodnota se opět zobrazí jako měna.
Pro zjištění číselné hodnoty máme přidanou vlastnost Value.
Jediný zádrhel je na událostech GotFocus a LostFocus, při změně zarovnání či textu se začnou volat cyklicky znovu a znovu, což je třeba ošetřit pomocí proměnné.

Public Class CurrencyTextBox
    Inherits TextBox

    Sub New()
        MyBase.New()

        'pocatecni nastaveni
        Me.TextAlign = HorizontalAlignment.Right
        Me.Text = _Value.ToString("c")
    End Sub

    Private _Value As Decimal
    ''' <summary>
    ''' Obsahuje hodnotu zadanou v textovem poli
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Value() As Decimal
        Get
            Return _Value
        End Get
        Set(ByVal value As Decimal)
            _Value = value
            Me.Text = _Value.ToString("c")
        End Set
    End Property

    'pokud je hodnota True, nebudou se volat udalosti GotFocus a LostFocus
    Private IgnoreGetLostFocus As Boolean = False

    Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
        If IgnoreGetLostFocus Then Exit Sub

        'zarovnat vlevo a zobrazit jen cislo
        IgnoreGetLostFocus = True
        Me.Text = _Value
        Me.TextAlign = HorizontalAlignment.Left
        IgnoreGetLostFocus = False

        MyBase.OnGotFocus(e)
    End Sub

    Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
        If IgnoreGetLostFocus Then Exit Sub

        'zarovnat zpet vpravo a zformatovat hodnotu na menu
        IgnoreGetLostFocus = True
        If Not Decimal.TryParse(Me.Text, _Value) Then Beep()
        Me.Text = _Value.ToString("c")
        Me.TextAlign = HorizontalAlignment.Right
        IgnoreGetLostFocus = False

        MyBase.OnLostFocus(e)
    End Sub

End Class 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.