e.Keychar.toUpper funktioniert nicht

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    e.Keychar.toUpper funktioniert nicht

    Hi,

    Ich habe eine Textbox, nennen wir sie txtSearchHex.

    In diese Box möchte ich nur Ziffern, HexZeichen und Blanks entgegen nehmen. Kleinbuchstaben sollen automatisch in Großbuchstaben übersetzt werden. Die üblichen Tasten, wie DELETE, INSERT, CTRL-C, CTRL-V, CTRL-X, BACKSPACE etc. sollen auch funktionieren. Alle anderen Tasten sollen ignoriert werden.

    So habe ich das versucht:

    VB.NET-Quellcode

    1. Private Sub txtSearchHex_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtSearchHex.KeyPress
    2. If "abcdef".Contains(e.KeyChar) Then e.KeyChar = e.KeyChar.ToUpper 'Translate to upper case
    3. If Not "0123456789ABCDEF ".Contains(e.KeyChar) AndAlso 'Ignore all other keystrokes ...
    4. e.KeyChar >= " " Then ' '... unless below space
    5. e.Handled = True
    6. Exit Sub
    7. End If
    8. End Sub


    Leider klappt das nicht. Die Anweisung e.KeyChar.ToUpper , löst einen Compiler Fehler aus:

    BC30516 Fehler bei der Überladungsauflösung, da keine zugreifbare "ToUpper" diese Anzahl von Argumenten akzeptiert.

    Umgehen kann ich den Fehler relativ leicht:

    VB.NET-Quellcode

    1. If "abcdef".Contains(e.KeyChar) Then e.KeyChar = Convert.ToChar(e.KeyChar.ToString.ToUpper) 'Translate to upper case


    Und dann funktioniert mein Programm auch.

    Aber ich würde das halt auch gern verstehen ! Wieso funktioniert denn die .ToUpper Anweisung auf einem Character nicht ? Und muss man das wirklich so umständlich kodieren ?

    LG
    Peter

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

    Du kannst es andersrum machen: da hier .ToUpper() eine Shared-Charfunktion (so wie String.IsNullOrEmpty(DeinString)) ist, wäre die "korrekte" Anwendung: Char.ToUpper(e.KeyChar)

    Peter329 schrieb:

    Und muss man das wirklich so umständlich kodieren ?
    Meinst Du damit Deine Lösung oder das mit dem ganzen Eingabenachbearbeiten?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Der eigentliche Fehler ist, dass e.KeyChar vom Typ "Char" ist, und dieser Typ hat keine Instanz-Methode "ToUpper". Die gibt es nur beim Typ String. Du kannst also umständlich den Umweg über einen String gehen, oder, wie VaporiZed vorschlägt, die statische Methode Char.ToUpper() verwenden.
    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.
    Supi ... das war es, was ich gesucht hatte. Und das verstehe ich jetzt auch. Herzlichen Dank an die Ratgeber !

    VaporiZed schrieb:

    Meinst Du damit Deine Lösung oder das mit dem ganzen Eingabenachbearbeiten


    Also ich meine damit, dass ich alle Vorschläge gern aufgreife, wenn es bessere / elegantere Möglichkeiten gibt, das gewünschte Coding zu realisieren. Deshalb hab ich ja nicht nur das Syntax Problem eingestellt, sondern auch das Design Ziel. :)

    LG
    Peter

    Peter329 schrieb:

    Wieso funktioniert denn die .ToUpper Anweisung auf einem Character nicht ? Und muss man das wirklich so umständlich kodieren ?
    hättste eiglich selbst finden müssen.
    Du kennst den Datentyp - char - und du kennst den ObjectBrowser - du kennst sogar den Namen der Methode, die du verwenden wolltest.
    Wieso nicht einfach mal nachgugge?

    Peter329 schrieb:

    Also ich meine damit, dass ich alle Vorschläge gern aufgreife, wenn es bessere / elegantere Möglichkeiten gibt, das gewünschte Coding zu realisieren.
    Früher, als ein Zeichen noch ein Byte lang war, also einst, haben wir einfach eine simple And- und Or-Operation gemacht, um Großbuchstaben zu erzeugen:
    Or &h20 => Kleinbuchstabe
    And Not &h20 => Großbuchstabe
    In .NET muss das allerdings hin- und her gecastet werden, da wird es nicht wirklich eleganter.
    Aber:
    In der KeyDown-Methode ist e.KeyValue der Charakter eines Großbuchstaben. ;)

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    2. Dim ch = e.KeyValue
    3. Label1.Text = Convert.ToChar(ch)
    4. End Sub

    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!