Option Strict On - kein Spätes Binden

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von uNbRaKe.

    Option Strict On - kein Spätes Binden

    Hallo,

    ich habe das Problem, dass Option Strict On "spätes Binden" nicht zu lässt.

    VB.NET-Quellcode

    1. Me.Validate()
    2. Me.TestBindingSource.Current("Benutzer(Datensatzinfo)") = Environment.UserName
    3. Me.TestBindingSource.Current("Datum(Datensatzinfo)") = heutigesDatum
    4. Me.TestBindingSource.Current("Zeit(Datensatzinfo)") = jetzigeUhrzeit
    5. Me.TestBindingSource.EndEdit()
    6. Me.TableAdapterManager.UpdateAll(Me.TestDataSet)


    Kann mir das bitte jemand erklären?
    @ErfinderDesRades

    VB.NET-Quellcode

    1. Me.TestBindingSource.Current("Benutzer(Datensatzinfo)") = Environment.UserName
    2. Me.TestBindingSource.Current("Datum(Datensatzinfo)") = heutigesDatum
    3. Me.TestBindingSource.Current("Zeit(Datensatzinfo)") = jetzigeUhrzeit


    "Current" ist dabei jeweils rot unterstrichen

    Welcher Datentyp das ist, konnte ich nicht ermitteln.
    EdR hat Dir sogar einen Link gegeben, mit dem Du die Frage beantworten kannst. Oder du zeigst in Visual Studio mit der Maus auf Current und es wird Dir gezeigt. Danach weißt Du auch schon bald, warum die Meldung kommt.
    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.
    Wenn überhaupt, dann ist das eine Collection. Ein Element aus einer List(of T) kann nicht auf diese Weise aufgerufen werden. Interessant ist aber eher von welchem Typ "T" in diesem Fall ist. Welchen Datentyp haben die Element in deiner Collection?

    EDIT: Hat sich mit dem Post von @ErfinderDesRades erledigt.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Yanbel“ ()

    Es mag sein, dass das Objekt eine Liste ist, aber es ist nicht als Liste deklariert.
    Daher weiss der Compiler nicht, dass es eine Liste ist (wenn es überhaupt eine Liste ist).
    Nach dem Datentyp der Elemente dieser mutmasslichen Liste zu fragen ist den dritten Schritt vor dem ersten tun.

    @uNbRaKe: 1. Schritt: Beantworte die Frage: Welchen Datentyp hat Me.TestBindingSource.Current?

    Mit Hilfe des gegebenen Tut sollte sich das in 5s beantworten lassen (zuzüglich natürlich der Zeit, die man braucht, um das Video anzugucken).



    uNbRaKe schrieb:

    ich habe das Problem, dass Option Strict On "spätes Binden" nicht zu lässt.
    Kann mir das bitte jemand erklären?
    Das kann übrigens bereits erklärt werden:
    "Spätes Binden" (engl: Late Binding) meint, dass auf einen Objekt-Member zugegriffen wird, der zur CompileZeit nicht bekannt ist.
    Also die Klammern mit dem String:

    VB.NET-Quellcode

    1. Me.TestBindingSource.Current("Datum(Datensatzinfo)")
    versucht auf etwas zuzugreifen, was dem Compiler nicht bekannt ist.
    Sowas macht ein Strict-On-Compiler nicht, weil das eine höchst fehlerträchtige Operation ist (und langsam, und nicht nötig).
    Wäre Strict.Off, so wäre Late Binding aktiviert, und der Compiler würde nicht meckern. (Stattdessen würden Fehler auftreten, wenn das Programm läuft, und an diese Stelle kommt).

    Da ist es wesentlich besser, wenn der Compiler bereits jetzt meckert, und der Programmierer Sorge tragen kann, dass dem Compiler bekannt gemacht wird, auf welchen Objekt-Member zugegriffen werden soll.

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

    Super!

    Und an ein Objekt kann man nicht eine Klammer mittm String dranhängen

    VB.NET-Quellcode

    1. dim obj As Object = new Object
    2. obj("Datum(Datensatzinfo)") = heutigesDatum
    ergibt keinen Sinn - das sagt dir der Compiler.
    Wäre es ein String-Dictionary, oder eine TreenodeCollection, oder...., dann ergäbe es Sinn, denn diese Klassen haben eine indizierte Default-Property, die sone Syntax akzeptiert

    VB.NET-Quellcode

    1. dim dic as Dictionary(Of String, Date)
    2. dic("Datum(Datensatzinfo)") = heutigesDatum




    Du sagst:

    uNbRaKe schrieb:

    ruft das aktuelle Element der Liste auf.
    Welche Liste?
    Ist Me.TestBindingSource eine Liste?
    Nein - es ist eine BindingSource.
    Kann man im weitesten Sinne auch als Liste auffassen, aber das ist schon seehr frei interpretiert.
    Zum beispiel funktioniert die Add-Methode der BindingSource nicht, wenn sie gebunden ist (und dazu ist sie da).

    So eine BindingSource kann alles mögliche enthalten, je nachdem, woran sie gebunden ist.
    Ist sie an eine DataTable gebunden, so enthält sie DataRowViews.
    Me.TestBindingSource.Current könnte also ein DataRowView sein - auch wenn .Current nicht als DataRowView deklariert ist.
    Ich weiss es nicht, und dein Compiler weiss es erst recht nicht.
    jedenfalls, wenn die BindingSource an eine DataTable gebunden ist, dann weiss ich es: DataRowView.
    Und dann kann ich dem Compiler helfen, indem ich ihm sage, was das für ein Ding ist:

    VB.NET-Quellcode

    1. dim drv = DirectCast(Me.TestBindingSource.Current, DataRowView)
    Dann würde es sogar prinzipiell Sinn machen, Klammern mit Strings anzuhängen, etwa so:

    VB.NET-Quellcode

    1. dim drv = DirectCast(Me.TestBindingSource.Current, DataRowView)
    2. drv("NameDerErstenSpalte") = Environment.UserName
    3. drv("NameDerZweitenSpalte") = heutigesDatum
    Weil ein DataRowview steht für einen Datensatz einer DataTable, und die hat ja string-benannte-Spalten.
    Allerdings bei

    VB.NET-Quellcode

    1. dim drv = DirectCast(Me.TestBindingSource.Current, DataRowView)
    2. drv("Benutzer(Datensatzinfo)") = Environment.UserName
    3. drv("Datum(Datensatzinfo)") = heutigesDatum
    hätte ich grosse Zweifel, dass die Spalten wirklich so heissen - aber möglich ist das.

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

    @ErfinderDesRades Erst einmal vielen Dank für die ausführliche Erklärung.

    Meine

    VB.NET-Quellcode

    1. Bindingsource
    ist an eine

    VB.NET-Quellcode

    1. DataTable
    gebunden und die Spalten haben die im String verfassten Namen.

    VB.NET-Quellcode

    1. ​Dim drv = DirectCast(Me.TestBindingSource.Current, DataRowView)
    2. Me.Validate()
    3. drv("Benutzer(Datensatzinfo)") = Environment.UserName
    4. drv("Datum(Datensatzinfo)") = heutigesDatum
    5. drv("Zeit(Datensatzinfo)") = jetzigeUhrzeit
    6. Me.TestBindingSource.EndEdit()
    7. Me.TableAdapterManager.UpdateAll(Me.TestDataSet)


    funktioniert perfekt und speichert die Werte der Variablen ab, wie es geplant war.