Per Button in TextBox "." einfügen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von lurker.

    Per Button in TextBox "." einfügen

    Hallo Leute!

    Ich hab mal wieder ein triviales Problem... :S und zwar füge ich mit folgendem Code ein Zeichen in die TextBox(txtBoxZahlen) ein (Es handelt sich um Zahlen, wie bei einem TR):

    VB.NET-Quellcode

    1. Private Sub NumberField(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    2. Handles btnNr1.Click, btnNr2.Click, btnNr3.Click, btnNr4.Click, btnNr5.Click, _
    3. btnNr6.Click, btnNr7.Click, btnNr8.Click, btnNr9.Click, btnNr0.Click, btnDot.Click
    4. Dim c As Button = DirectCast(sender, Button)
    5. txtBoxZahlen.Text &= c.Text
    6. txtBoxZahlen.Focus()
    7. txtBoxZahlen.Select(txtBoxZahlen.Text.Length, 0)
    8. End Sub

    Bei Zahlen funktioniert auch alles so weit. Doch wenn ich auf den Punkt klicke (btnDot) dann wird aus z.B.:
    44 => .44
    und wenn ich dann eine Zahl hinzufüge wieder:
    .44 => 44.5

    Der Button heißen so, was er einfügen sollte:
    btnNr1 hat als Text 1
    btnNr2 hat als Text 2
    ...
    btnNrn hat als Text n
    btnDot hat als Text einen . (Punkt)

    An was kann das liegen?

    Würde mich auf eine Antwort freuen!
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Ich nehme an, du hast RightToLeft eingestellt - verwende stattdessen TextAlign = Right.

    lurker schrieb:

    Es handelt sich um Zahlen, wie bei einem TR
    In eine TextBox werden Strings eingefügt.
    Rechne also mit Ziffern und * 10 bzw. / 10 und zeig das Ergebnis an.

    VB.NET-Quellcode

    1. Value = 0
    2. ' 1 gedrückt:
    3. Value *= 10
    4. Value += 1
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hast du irgendwas an deiner Textbox "rumgebastelt" um - *hust* - "sicherzustellen", dass nur Zahlen eingegeben werden? Irgendein obskurer Code im TextChanged- oder Validating-Event oder ähnliches?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    Textbox "rumgebastelt"
    Er hat 11 Button, auf denen "0" ... "9" und "." draufsteht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Er hat 11 Button, auf denen "0" ... "9" und "." draufsteht.

    Richtig. Und? Ich suche nach der Ursache, warum bei TextBox.Text &= c das c nicht am Ende vom Text sondern am Anfang eingefügt wird. Das hat mit den Buttons nach meiner Einschätzung überhaupt nichts zu tun.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    sondern am Anfang eingefügt wird.
    @lurker:: Hab das eben mal nachgestellt, bei mit funktioniert es.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    BjöNi schrieb:

    verwende stattdessen TextAlign = Right.

    Danach ist der Text auf der rechten linken Seite. Bring aber leider auch keinen Erfolg.

    RodFromGermany schrieb:

    Rechne also mit Ziffern und * 10 bzw. / 10 und zeig das Ergebnis an.

    Das verstehe ich jetzt leider nicht :huh:

    Arby schrieb:

    Textbox "rumgebastelt"
    Nein, ich benutzer derzeit kein einziges Event.


    Als Info:
    Ich habe die Textbox als RightToLeft = true
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „lurker“ ()

    lurker schrieb:

    Ich habe die Textbox als RightToLeft = true

    Und wieso machst du das nicht auf False? Die Eigenschaft ist - siehe auch Online-Hilfe - ausschließlich für die Unterstützung von Ländern gedacht, in denen die Schrift von Rechts nach Links verläuft (Hebräisch, z.B.). Kein Wunder, dass dein Punkt an so komischen Stellen erscheint... *seufz*

    lurker schrieb:

    Danach ist der Text auf der rechten Seite. Bring aber leider auch keinen Erfolg.

    Du hast schon gelesen, was BjöNi geschrieben hat? Stattdessen steht da. Wenn du TextAlign auf Right stellst, musst du dafür (stattdessen!) RightToLeft auf False setzen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    lurker schrieb:

    Danach ist der Text auf der rechten Seite. Bring aber leider auch keinen Erfolg.
    Was hattest du denn sonst damit vor?

    lurker schrieb:

    Das verstehe ich jetzt leider nicht
    Arbeite mit Zahlen / Ziffern, nicht aber mit Strings.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Rechne also mit Ziffern und * 10 bzw. / 10 und zeig das Ergebnis an.
    Ich habe nun folgendes gemacht:

    VB.NET-Quellcode

    1. Private wertAblage As Double
    2. Private wertStellen As Integer = 1
    3. Private nachKommaStellen As Boolean
    4. Private Sub btnDot_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDot.Click
    5. nachKommaStellen = True
    6. End Sub
    7. Private Sub NumberField(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    8. Handles btnNr1.Click, btnNr2.Click, btnNr3.Click, btnNr4.Click, btnNr5.Click, _
    9. btnNr6.Click, btnNr7.Click, btnNr8.Click, btnNr9.Click, btnNr0.Click
    10. Dim control As Button = DirectCast(sender, Button)
    11. If nachKommaStellen Then
    12. wertStellen *= 10
    13. wertAblage += Integer.Parse(control.Text) / wertStellen
    14. Else
    15. wertAblage *= 10
    16. wertAblage += Integer.Parse(control.Text)
    17. End If
    18. txtBoxZahlen.Text = wertAblage.ToString
    19. End Sub


    Meinst du das so?
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Das geht in die richtige Richtung.

    lurker schrieb:

    VB.NET-Quellcode

    1. Dim control As Button = DirectCast(sender, Button)
    Da solltest Du gleich die Ziffer rausholen:

    VB.NET-Quellcode

    1. Dim value = Integer.Parse(DirectCast(sender, Button).Text)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    lurker schrieb:

    txtBoxZahlen.Text = wertAblage.ToString

    Und wenn wir schon dabei sind: Ich bin der Meinung, dass es nie verkehrt ist, alle Möglichkeiten zu kennen, darum hier noch als zusätzliche Info - auch wenn ich glaube, dass du es vermutlich für deine Zwecke erstmal nicht brauchst:

    Sowohl Parse() als auch ToString() von numerischen Wertklassen benutzen standardmäßig das Zahlenformat der aktuellen Kultur, können aber auf Wunsch auch mit einer definierten NumberFormatInfo (Namespace System.Globalization) gefüttert werden. Diese Klasse legt z.B. unter anderem fest, wie solche Zahlen formatiert werden, also ob Punkt oder Komma als Dezimaltrennzeichen verwendet werden, ob es Tausender-Punkte gibt, etc... So ein NumberFormatInfo könnte man sich selbst zusammenbauen, in der Regel nimmt man aber einfach ein fertiges NumberFormatInfo-Objekt, das von einem CultureInfo-Objekt bereitgestellt wird.

    Das wird z.B. dann von Bedeutung, wenn du die Zahlen in Strings umwandelst, um sie in Textdateien zu speichern um sie später wieder einzulesen. Dann ist es immer gut, ein "allgemeines" Format zu nehmen (z.B. Globalization.CultureInfo.InvariantCulture.NumberFormat), um sicherzustellen, dass solche Dateien auch zwischen Rechnern ausgetauscht werden können, die verschiedene Betriebssystem-Sprachen eingestellt haben.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Das mit der Kultur war mir zwar klar, hab ich aber natürlich nicht angewant, da ich erfolgreich drauf vergessen habe.

    Für die Nachwelt hab ich hier nochmal den Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private wertAblage As Double
    2. Private wertStellen As Integer = 1
    3. Private nachKommaStellen As Boolean
    4. Private Sub btnDot_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDot.Click
    5. nachKommaStellen = True
    6. End Sub
    7. Private Sub NumberField(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    8. Handles btnNr1.Click, btnNr2.Click, btnNr3.Click, btnNr4.Click, btnNr5.Click, _
    9. btnNr6.Click, btnNr7.Click, btnNr8.Click, btnNr9.Click, btnNr0.Click
    10. Dim value As Integer = Integer.Parse(DirectCast(sender, Button).Text, Globalization.CultureInfo.InvariantCulture.NumberFormat)
    11. If nachKommaStellen Then
    12. wertStellen *= 10
    13. wertAblage += value / wertStellen
    14. Else
    15. wertAblage *= 10
    16. wertAblage += value
    17. End If
    18. txtBoxZahlen.Text = wertAblage.ToString(Globalization.CultureInfo.InvariantCulture.NumberFormat)
    19. End Sub



    Für Verbesserungsvorschläge bin ich natürlich offen.
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%

    lurker schrieb:

    VB.NET-Quellcode

    1. Dim value As Integer = Integer.Parse(DirectCast(sender, Button).Text, Globalization.CultureInfo.InvariantCulture.NumberFormat)
    Wenn Du weißt, dass auf Deinen Buttons nur die Ziffern 0...9 drauf sind, brauchst Du keine CultureInfo,

    VB.NET-Quellcode

    1. Dim value As Integer = Integer.Parse(DirectCast(sender, Button).Text)
    genügt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    lurker schrieb:

    Sonst noch was?
    Poste mal das ganze Projekt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich habe mich vor kurzem in die Entwicklung von PlugIn-System eingelesen. Um mir ein Bild zu machen, und um einfach mal zu Testen, habe ich mir einen "Erweiterbaren Taschenrechner" gebaut. Der Sinn ist zwar jedlich nur der, dass ich mir die Entwicklung von sollchen Systemen aneigne, doch ich find die Idee gut und scheiterte eben an dieser blöden Kleinigkeit. In meinem Projekt ist derzeit auch nicht mehr, als eine Methode zum laden der PlugIns, und der Code, der die Werte direkt an das jeweilige PlugIn übergibt.

    Ich hänge einfach mal das Project an.
    Dateien
    • Rechner.zip

      (141,7 kB, 100 mal heruntergeladen, zuletzt: )
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lurker“ ()