[VB.NET] Textbox validatie

Pagina: 1
Acties:
  • 141 views sinds 30-01-2008
  • Reageer

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

Topicstarter
Vroeger in VB 6.0 kon ik voor een Textbox het veldje 'numeric' aanvinken. Vervolgens kon ik alleen nog maar nummertjes invullen in die textbox.

In VB.NET lijkt dat niet meer te zitten en kan ik ook niet zo gauw iets vinden waarmee zoiets te doen is. Nou is VB.NET nieuwer dan VB 6.0, en dus vraag ik me af of ze niet een beter mechanisme hebben bedacht.

In ASP.NET schijn je iets van 'validators' te hebben, maar dat zit dus niet in VB.NET.

Wat ik nu geprobeerd heb is op de KeyPress van de textbox een functie aanroepen die een bepaalde toetsaanslag wel of niet toelaat (door e.handled op True of False te zetten). Dit werkt wel, maar ik kom steeds weer nieuwe kleine uitzonderingen tegen waardoor het al snel een draak van een functie wordt. In feite ben ik elke toetsaanslag op het huidige resultaat aan het toepassen en dan kijken of het nog steeds aan mijn validatieregels voldoet. Nogal dubbelop dus, aangezien ik het werk van de textbox zelf nog eens dunnetjes aan het overdoen ben.

Iemand een beter idee?

Macbook Pro


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:54

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:36
Ik weet niet of dit de beste oplossing is, maar kan je geen numerieke variabele aan de Text property van die TextBox binden?

https://fgheysels.github.io/


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Maak een ifje met de functie IsNumeric, die checkt of het ingevoerde getal numeriek is. Dus:

Visual Basic:
1
2
3
4
5
If IsNumeric(je_variabele) Then
voer hier wat uit
Else
MessageBox.Show("Ongeldige invoer!", "Foutje", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
End If

[ Voor 102% gewijzigd door Y0ur1 op 04-11-2003 11:01 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan ook je eigen subclass van een textbox maken.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class NumericTextBox : System.Windows.Forms.TextBox
{
    private const int ES_NUMBER = 0x00002000;
    public NumericTextBox()
    {
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.Style |= ES_NUMBER;
            return createParams;
        }
    }
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 06:49
YT-Croc schreef op 04 november 2003 @ 10:56:
Maak ik ifje met de functie IsNumeric, die checkt of het ingevoerde getal numeriek is.
Dat doet het wel, die zet je dan in het lostfocus event (gebruiker wordt alleen aan't eind gewaarschuwd, maar lichtere programatuur) of in het keyup event (meer denkwerk voor computer, bij tikfout direct een waarschuwing)

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Probeer dit eens in het KeyPress_event van de textbox:

Visual Basic .NET:
1
2
3
If Not IsNumeric(textbox) Then
  KeyCode = 0
End If


Deze code zorgt ervoor dat als de invoer NIET numeriek is er geen toetsaanslag wordt doorgegeven.

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

Topicstarter
Ok, dat is dus vrijwel *precies* wat ik nu aan het doen ben. Mijn KeyPress functie is wel een stuk ingewikkelder, maar ja, ik kan dan bijvoorbeeld ook geen - teken midden in een getal zetten en meer van dat soort dingen die niet door het voorbeeld afgevangen worden. Ook kun je bij mijn functie geen leading '0'-en opgeven, die worden netjes opgegeten.

Maar ik begrijp hier uit dat er dus echt niets anders op zit?

De problemen komen namelijk wanneer je met CTRL-C en CTRL-V gaat copyen en pasten. CTRL-C en CTRL-V worden met deze manier uitgeschakeld en dus kun je niet meer copyen en pasten. Maar als je ze inschakeld (door KeyAscii 3 en 22 toe te laten), dan wordt hetgeen je paste weer niet gevalideerd.

Toch wil ik graag dat de mensen kunnen copyen en pasten (en ze willen dat zelf ook graag :)).

[ Voor 23% gewijzigd door RetepV op 04-11-2003 13:27 ]

Macbook Pro


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je wilt dus blijkbaar ook negatieve getallen accepteren? Dan werkt mijn methode ook niet echt goed. Je kan het dan wel op de volgende manier doen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class NumericTextBox : TextBox
{
    private string _oldText;

    public NumericTextBox()
    {
        this.TextChanged += new EventHandler( myChangedHandler );
    }

    protected void myChangedHandler( object sender, EventArgs e )
    {
        int selStart = SelectionStart;
        if( Text.Equals( "" ) || (Text.Length == 1 && Text.Equals( "-" )) )
        {
            _oldText = Text;
            return;
        }
        try
        {
            long.Parse( Text );
        }
        catch( Exception )
        {
            Text = _oldText;
            if( selStart >= 0 )
                SelectionStart = selStart;
            return;
        }
        _oldText = Text;
    }
}

Het nadeel hiervan is wel dat je dan als er een toets ingedrukt wordt even kort het karakter verschijnt en dan weer weghaalt. Je kan dit natuurlijk wel op een of andere manier combineren met het gebruik van het KeyPressed event.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

Topicstarter
rwb schreef op 04 november 2003 @ 14:26:
Je wilt dus blijkbaar ook negatieve getallen accepteren? Dan werkt mijn methode ook niet echt goed. Je kan het dan wel op de volgende manier doen.

[knip]
Hmm, maar dan is de manier waarop ik het nu doe toch nog ietsje gebruiksvriendelijker. De validatie zoals ik die nu doe geeft een *ping* direkt op het moment er iets ingetoets wordt dat niet mag.

Dat van dat subclassen, daar had ik eigenlijk niet aan gedacht, maar nu je het zo schrijft schiet me inderdaad te binnen dat het een Style van de textbox is en niet iets dat in de textbox class is verwerkt. Dus in feite zit wat ik bedoel ook niet in het oude VB 6.0.

Maar goed, ik begrijp dat er in VB.NET niet iets dergelijks al ingebakken zit en dat ik in feite op mezelf aangewezen ben. Vaag eigenlijk, want volgens mij zit er wel validatie bij als je databindings gebruikt. Zeker ongedocumenteerd dan.

Tnx mensen! Ook degene op wie ik niet geantwoord had (maar jullie stelden allemaal ongeveer hetzelfde voor :)).

Macbook Pro


  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

Topicstarter
EmilneM schreef op 04 november 2003 @ 12:04:
Probeer dit eens in het KeyPress_event van de textbox:

Visual Basic .NET:
1
2
3
If Not IsNumeric(textbox) Then
  KeyCode = 0
End If


Deze code zorgt ervoor dat als de invoer NIET numeriek is er geen toetsaanslag wordt doorgegeven.
Nog 1 opmerking:

Je doet hier 'KeyCode = 0' om de toets te laten 'verdwijnen'. Maar de officieele manier is om in het KeyPress event 'e.handled = True' te zetten als je de toetsaanslag wil opeten.

Het jammere van IsNumeric() is trouwens dat het een nogal idioot simplistische check is. Als je iets gebruiksvriendelijker wilt zijn en bijvoorbeeld floating-point getallen in een integer textbox niet wilt toestaan zul je zelf iets moeten schrijven.

Macbook Pro


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RetepV schreef op 04 november 2003 @ 14:39:
[...]
Hmm, maar dan is de manier waarop ik het nu doe toch nog ietsje gebruiksvriendelijker. De validatie zoals ik die nu doe geeft een *ping* direkt op het moment er iets ingetoets wordt dat niet mag.
Ja daarom zet ik er ook bij dat je eventueel een combinatie van beide kan maken. In je KeyPressed kan je gewoon doen wat je nu ook al doet met uitzondering van de copy/paste. En dan kan je in geval van de copy paste in de textchanged kijken of het een geldig getal is.
Dat van dat subclassen, daar had ik eigenlijk niet aan gedacht, maar nu je het zo schrijft schiet me inderdaad te binnen dat het een Style van de textbox is en niet iets dat in de textbox class is verwerkt. Dus in feite zit wat ik bedoel ook niet in het oude VB 6.0.
Het is makkelijker om er een SubClass van te maken omdat je deze dan later makkelijker kan hergebruiken.
Hoe VB 6.0 het doet zou ik eigenlijk niet weten omdat ik daar nog nooit in geprogrammeerd heb.
Het jammere van IsNumeric() is trouwens dat het een nogal idioot simplistische check is. Als je iets gebruiksvriendelijker wilt zijn en bijvoorbeeld floating-point getallen in een integer textbox niet wilt toestaan zul je zelf iets moeten schrijven.
Om te kijken of het een geldige waard is kan je gewoon gebruik maken van
C#:
1
2
3
4
Int32.Parse( string val );
Int64.Parse( string val );
Single.Parse( string val );
Double.Parse( string val );

Er zijn hier maar 2 uitzonderingen op die ook in mijn code voorbeeld in mijn vorige post staan en dat is als je een lege string hebt of een enkel character wat een '-' is.

[ Voor 24% gewijzigd door Woy op 04-11-2003 14:59 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

Topicstarter
rwb schreef op 04 november 2003 @ 14:56:
Om te kijken of het een geldige waard is kan je gewoon gebruik maken van
C#:
1
2
3
4
Int32.Parse( string val );
Int64.Parse( string val );
Single.Parse( string val );
Double.Parse( string val );

Er zijn hier maar 2 uitzonderingen op die ook in mijn code voorbeeld in mijn vorige post staan en dat is als je een lege string hebt of een enkel character wat een '-' is.
Hey, tnx voor de tip, deze had ik nog niet gevonden. Dit maakt mijn test weer een stukje kleiner en dus beter leesbaar en dus beter onderhoudbaar :).

Tnx!

Macbook Pro


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RetepV schreef op 07 november 2003 @ 14:20:
[...]


Hey, tnx voor de tip, deze had ik nog niet gevonden. Dit maakt mijn test weer een stukje kleiner en dus beter leesbaar en dus beter onderhoudbaar :).

Tnx!
Let er wel op dat deze methodes een Exception gooien als het parsen niet lukt. En niet zoals de IsNumeric methode ( Die in C# volgens mij trouwens niet eens bestaat ) een boolean.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1