IsNumeric funktioniert nicht

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    IsNumeric funktioniert nicht

    Hallo,
    habe das Problem, dass ich in einem Projekt nicht auf IsNumeric abfragen kann.
    In einem anderen Projekt geht das ohne Probleme.

    Beispiel:

    VB.NET-Quellcode

    1. If IsNumeric(123) Then
    2. End If


    Bekomme den Fehler: "IsNumeric" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe nicht zugegriffen werden.


    Woran könnte das liegen?
    "Mann" lernt mit seinen Projekten.
    IsNumeric ist eine "böse" Funktion und sollte nicht mehr verwendet werden.
    Was genau hast Du denn vor? Eventuell kann man Integer.TryParse bzw. Double.TryParse verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich möchte ein Textfeld Prüfen, ob dort eine Zahl eingetragen steht.

    Ich benötige den Inhalt des Textfeldes für eine SQL-Abfrage. Somit muss ich ja zwischen Text und Zahl unterscheiden.

    Trotz alle dem, müsste es aber auch so funktionieren oder nicht?
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Ich möchte ein Textfeld Prüfen
    Hatten wir bereits:

    Niko Ortner schrieb:

    Eventuell kann man Integer.TryParse bzw. Double.TryParse verwenden.
    Das geht so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim txt = TextBox1.Text
    3. Dim value = 0
    4. If Not Integer.TryParse(txt, value) Then
    5. MessageBox.Show("kein Integer")
    6. value = 0
    7. End If
    8. MessageBox.Show(value.ToString)
    9. End Sub

    Nimm ggf. Double.TryParse(...).
    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!
    Oder man verwendet gleich ein NumericUpDown statt einer TextBox.
    Und präventiv: Option Strict On, SQL-Injection

    Edit:
    für eine SQL-Abfrage. Somit muss ich ja zwischen Text und Zahl unterscheiden.

    Eigentlich nicht.
    Normalerweise ist von vornherein klar, welchen Datentyp man braucht. Die Definition der Tabelle in der Datenbank sagt ja aus, welchen Typ welche Spalte hat. Also muss man nur den richtigen Typ im Programm verwenden. Dagegen würde das nicht funktionieren, wenn ein Integer erwartet wird, man aber einen String eingibt und das Programm so tut, als wolle es einen String in die Integer-Spalte der Datenbank einfügen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Normalerweise ist von vornherein klar, welchen Datentyp man braucht.


    ... da hast du Recht.

    Also wäre dann der richtige Weg, zu überprüfen ob der Inhalt der Textbox in den Datentyp der Zielspalte umgewandelt werden kann, und wenn nicht gebe ich dem Benutzer einfach nen Hinweis.

    So in etwa?
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Also wäre dann der richtige Weg
    durch Verwendung geeigneter Controls (z.B. NumericUpDown) eine Fehleingabe von vorn herein unmöglich zu machen.
    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!
    überprüfen ob der Inhalt der Textbox in den Datentyp der Zielspalte umgewandelt werden kann

    Es kann jetzt sein, dass ich das einfach falsch verstehe, aber im Normalfall kannst Du dem User eine exakt zugeschnittene GUI präsentieren. Die erlaubt von vornherein nur die Eingabe gültiger Daten.
    Aber um das genau zu beurteilen, müsste man wissen, was genau Du machst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    RodFromGermany schrieb:

    durch Verwendung geeigneter Controls


    Nicht möglich, es muss eine Textbox sein.
    Denn es kann auch ein String dort drin stehen.

    Ich habe eine ComboBox, in der ich alle Columns des Tables aufliste, dort kann Ich danneinstellen, nach welcher Spalte gefiltert werden soll. Hat der Benutzer dies getan, wir die combobox (ok, ist doch keine Textbox aber gleiche Situation) mit den in der Spalte vorhandenen Werten unique grfüllt. Somit kann man einen Filterwert auswählen oder selber einen eintragen.
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Denn es kann auch ein String dort drin stehen.
    z.B. "Bockwurst mit Sauerkraut", den Du dann in einen Integer konvertieren willst?
    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:

    den Du dann in einen Integer konvertieren willst?


    Nein.

    Gehen wir mal davon aus, das in dem Textfeld immer der passende Datentyp drin steht.
    Jetzt muss ich aber für die SQL-Abfrage erkenne, ob es ein String ist, damit ich diesen in Hochkomma setzen kann.

    VB.NET-Quellcode

    1. "where SpalteMenue = 'Bockwurst mit Sauerkraut'"


    Es könnte nun auch sein, dass ich die anzahl der Würste suche:

    VB.NET-Quellcode

    1. "where SpalteAnzahl = 20"


    Aber nochmal zum Ursprung:
    Hat denn jemand eine Idee, woran es liegen konnte, das die Funktion IsNumeric nicht funktioniert? Ob das jetzt guter oder schlechter Code ist, das lassen wir mal gerade dahingestellt sein.
    Gibt es irgendetwas, was ich verstellt haben könnte?
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    der passende Datentyp
    wäre String für SpalteMenue und Integer für SpalteAnzahl.
    Das sind bei mir 2 Controls, ein String-Control TextBox und ein Numeric-Control NumericUpDown.
    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!

    ErfinderDesRades schrieb:

    Offenbar ist dir nicht zu helfen

    Ich denke man muss hier 2 Sachen unterscheiden!
    1. Mir ist schon zu helfen, und Ich werde mit sicherheit versuchen Eure anstöße unzusetzen.

    2. Ging es darum herauszufinden, warum eine Funktion nicht auszuführen istz, wie sonst.
    In den Projekteinstellungen war der Namespace microsoft.visualbasic nicht angeklickt.

    RodFromGermany schrieb:

    Das sind bei mir 2 Controls


    Aber unpraktikabel.

    Wie würdet Ich einen Filter für eine Datenbank denn machen? (Bitte jetzt keine diskussionen über das Datenmodell)

    Es gibt eine Datenbank mit einem Table, welcher über 200 Spalten hat, mit den unterschiedlichsten Datentypen.
    Jetzt möchte Ich einen Filter beim einlesen der Daten verwenden. Um nicht unnötig viele Controls zu haben sollten sich somit die eingabefelder auf das nötigste beschränken.
    Ein Feld für die zu durchsuchende Spalte, dann muss es die möglichkeit ><= eingeben zu können und dann soll es die Möglichkeit geben dass eine Filterwert ausgewählt, bzw. eingegeben werden kann.

    Ich würde es als zumutung für den User sehen, wenn der sich gedanken darüber machen müsste, ob er jetzt einen Text eingibt oder eine Zahl. Filtern ist filtern.






    "Mann" lernt mit seinen Projekten.

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

    Wie RodFromGermany reklärt hat, sind das bei ordentlich designten GUIs zwei separate Controls. Je das richtige für den Spaltentyp.

    damit ich diesen in Hochkomma setzen kann
    Wenn das der einzige Grund ist, kannst Du's sowieso vergessen. Lies Dir den zweiten Link in Post #6 durch. Wenn Du das verstanden hast, stellt sich die Frage nach dem Setzen der Hochkomma nicht mehr.


    Edit:
    In den Projekteinstellungen war der Namespace microsoft.visualbasic nicht angeklickt.
    Und das ist auch gut so, denn dann kommst Du gar nicht erst auf die Idee, diese Funktionen zu verwenden.
    Ich trau mich jetzt mal zu sagen, dass wir genug Erfahrung haben, zu wissen, dass isnumeric immer der falsche Ansatz ist. Deshalb versuchen wir gar nicht erst, Dir zu erklären, warum das nicht funktioniert, weil wir Angst haben, dass Du anstelle der möglicherweise etwas schwerer zu verstehenden, aber saubereren Methode, doch die unsaubere Methode verwendest.


    Edit 2 (bezogen auf den Edit von Post #15):
    Welches Control angezeigt und verwendet wird, ergibt sich aus dem Typ der Spalte. Der User wählt eine Spalte mit Integer-Typ aus -> Programm zeigt NumericUpDown an. String -> TextBox.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    jo, mit nicht zu helfen meine ich, dass du an den bösen Funktionen festhälst, obwohl dir die Alternative TryParse genannt worden ist.
    Ich fürchte auch, dass du statt beim anderen Rechner den MVS-Namespace rauszunehmen, um sauberer zu proggen, du bei diesem den Namespace des Grauens nun auch noch reinmachst. Da ist doch nicht zu helfen.

    Das mit dem Filter hingegen verstehe ich - Filtern kann beliebig komplex werden, und ein Szenario ist eben, dass der User inne selbe Filter-Eingabe sowohl textbasierte als auch numerische Filter eingeben will. Da musste dann halt kluge Logik coden, vorzugsweise ohne IsNumeric, tätich empfehlen.