Table Names eines DataSets sollen in Combobox eingetragen werden -> Option Strict On laesst Late Binding nicht zu

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

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

    Table Names eines DataSets sollen in Combobox eingetragen werden -> Option Strict On laesst Late Binding nicht zu

    Moin,

    ich komm wiedermal nicht selber weiter. Ich bekomme den Fehler Option Strict On läßt Late Biding nicht zu (... table.TableName...).

    Ich habe ein DataSet=AuswertungSettings aus dem sollen alle Namen der Tables als Einträge in eine Combobox=CbxTableView eingetragen werden.
    Ich hab es mit DirectCast versucht Fehler ist immer noch Late Binding. Was mach ich falsch???

    VB.NET-Quellcode

    1. Private NumberOfTablesInDataSet As Integer
    2. Private Sub FrmSettings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. NumberOfTablesInDataSet = AuswertungSettings.Tables.Count
    4. For Each table In AuswertungSettings.Tables
    5. CbxTableView.Items.Add(DirectCast(table.TableName, String))
    6. Next table
    7. End Sub
    codewars.com Rank: 4 kyu
    IntelliSense hilft. Wenn Du mit der Maus über table gehst, siehst Du, das die Variable table vom Typ Object ist. Warum? Weil AuswertungSettings.Tables vom Typ DataTableCollection ist. Also musst Du entweder den table-Typ explizit festlegen

    VB.NET-Quellcode

    1. For Each table As Data.DataTable In Tds.Tables

    oder die Collection casten

    VB.NET-Quellcode

    1. For Each table In Tds.Tables.Cast(Of Data.DataTable)

    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.
    Hi,

    ich glaube nicht, dass der Fehler in diesem Stück Code steckt. table.TableName ist bereits vom Typ String. Hier gibt es keinen Grund zu casten.

    Du hast bestimmt noch mehr Code, oder? Gewöhne Dir auch an, die Zeile zu nennen, in der der Fehler auftritt.

    @VaporiZed hat Recht!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @ VaporiZed Tausend Dank! Mal wieder.

    VB.NET-Quellcode

    1. For Each table As DataTable In AuswertungSettings.Tables
    2. CbxTableView.Items.Add(table.TableName)
    3. Next table
    (works)

    Woher weisst Du das es "As DataTable" ist. Wo schau ich so was nach? Wie sucht man nach Lösungen bei ähnlichen Problemen oder muss man die Typen und NameSpaces "einfach" kennen.

    @SpaceyX Wollte kurz sagen das dein dein Youtube Video DataSet (Alien Movies) mir sehr geholfen hat. Danke!
    codewars.com Rank: 4 kyu
    Woher ich das weiß? Nun, einmal weil ich schon ne Weile mit DataSets arbeite und zum anderen weil ich einige Möglichkeiten von Visual Studio nutze, die es mir zur Verfügung stellt.
    Aber vielleicht geht Deine Frage auch in eine andere Richtung.
    For Each X In Y -> der Typ von X wird mithilfe der Einstellung Option Infer aus Y abgeleitet - oder es wird zumindest versucht. Wenn Y ein "Vielfaches"* von Integer ist, ist X auch ein Integer. Wenn aber die Einzelkomponenten nur vom Typ Object sind, wird auch X automatisch zu Object. Wenn Du aber was konkretes angibst (also mithilfe von X As Integer oder Y.Cast(Of Integer), dann wird der Compiler versuchen, die einzelnen Items von Y in Integer umzuwandeln und X somit als Integer zu behandeln. Und da Du davon ausgehst oder weißt oder hoffst, dass bei Dir X bzw. table vom Typ DataTable ist, musst Du dies auch dem Compiler mitteilen. Sollte man mal n falschen Typ angegeben haben, bei dem eben die Items von Y nicht in den gewünschten/angegebenen Typ umgewandelt werden können, erhält man zur Laufzeit: System.InvalidCastException: "Ungültige Konvertierung von Typ CarsDataTable in Typ WasAuchImmerManAngegebenHat."

    * z.B. Array, List(Of), IEnumerable(Of)

    ##########

    Oh, oder meinst Du gar, dass Du nicht wusstest, dass das Ding DataTable heißt? Das wäre natürlich nicht so gut. Ein DataSet besteht aus DataTables, und die wiederum aus DataRows und DataColumns. Du solltest aber wissen, mit welchen Typen Du hantierst, wenn Du bestimmte Konstrukte verwendest. Da hilft dann der ObjectBrowser, MSDN, IntelliSense oder gar die DataSet-Klasse selber weiter.
    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.

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

    Ja das war die Frage.

    Vor der Lösung:
    Ich habe gesehen, dass Table den Typ Object hatte (wegen Option
    Infer
    aus
    Y
    (dank deiner Erklärung)weiss ich jetzt auch warum)

    Wie kann ich nun selber (ohne das ich es weiss) erkennen, dass es der Typ Datatable ist? Klar kenn ich Int, Boolean, Char, String etc. Aber Typen wie Datatable oder Textbox kenne ich so nicht, gibt es eine Möglichkeit diese in einer Geordneten Übersicht zu sehen oder lernt man die so "nebenbei" kennen?
    Alle Typen zu Zahlen
    Alle Typen zu DataSet
    Alle ...
    codewars.com Rank: 4 kyu
    Puh, wie gesagt: Recherche.
    In VS2019 ist der ObjectBrowser/Objektkatalog unter Ansicht -> Objektkatalog zu finden. Da ergibt sich bei meinem Testprojekt folgender Screenshot:

    Links Projektbestandteil inkl. der tDS-Bestandteile; rechts z.B. die CarsDataTable, bei der man sehen kann, dass sie grundsätzlich vom Typ DataTable ist (aber durch Vererbung zur CarsDataTable mit weiteren Eigenschaften spezialisiert wurde).
    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.
    Dieses Problem mittm ForEach geht auf Zeiten vor den Generics und vor Typ-Inference zurück.
    Ein Dataset hat die Property Tables, das ist die Auflistung der DataTables. Diese Auflistung ist aber nicht als moderne Auflistung ausgeführt (dann wärs einfach eine List(Of DataTable), sondern damals hat man noch für jede Auflistung einen eigenen Datentyp erfinden müssen - in diesem Falle die DataTableCollection
    Bei so alten Auflistungen kann ForEach nicht automatisch den Element-Typ (das Item) der Auflistung ableiten, daher muss man es ihm sagen

    VB.NET-Quellcode

    1. for each tbl As DataTable in myDataset.Tables
    2. ...
    Wie findet man den Element-Typ einer Auflistung?
    Jo, im ObjectBrowser die Auflistung aufsuchen, und den Datentyp der Item-Property nachgucken.
    Jede Auflistung hat eine Item(Index/key)-property, und es ist (fast) immer eine Default-Property.
    Default-Property heisst, man kann den Property-Namen weglassen, also schreiben

    VB.NET-Quellcode

    1. dim tbl = myDataset.Tables(0)
    2. 'anstatt ausführlich
    3. tbl = myDataset.Tables.Item(0)

    Wie gesagt: Das Problem tritt bei vielen Auflistungen auf: ControlCollection, StringCollection, TreenodeCollection - ihr merkt aber auch schon: diese Ollen Auflistungstypen führen (per Konvention) den Datetyp ihrer Elemente bereits im Namen.