DataSet / DataTable in Schleife durchlaufen

  • VB.NET

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

    DataSet / DataTable in Schleife durchlaufen

    Guten Abend,
    ich habe mir ein neues Problem geschaffen und kann es nicht lösen :rolleyes:
    Ich habe folgendes Dataset. Ich lese eine dxf-Datei ein und lege die Grafikelemente in dem Dataset ab.


    Um nun möglicht Code sparen zu arbeiten, möchte Ich jeden Table abarbeiten und die Grafiken da Zeichnen.

    Ich hatte gedacht das so zu lösen:

    VB.NET-Quellcode

    1. For Each _Table In GrafikElementeDataSet1.Tables
    2. Select _Table.TableName
    3. Case "Profil"
    4. Dim _Profil As GrafikElementeDataSet.ProfilDataTable
    5. _Profil = CType(_Table, GrafikElementeDataSet.ProfilDataTable)
    6. Case "Objekt1"
    7. End Select
    8. End For
    9. For Each Element In _Profil
    10. ' Hier wird dann gezeichnet


    Das Problem ist, dass Ich um auf den datatable von Objekt1 zu kommen natürlich .Objekt1DataTable schreiben muss.

    Ahhhh ?( Ich hoffe es kann hier irgend jemand erahnen was Ich da machen möchte.

    Wie kann Ich den jeweilihen Table variabel übergben?


    Beim schreiben der Daten habe Ich das gleiche Problem:

    VB.NET-Quellcode

    1. Private Sub _WriteElement(ElementTyp As String, _10 As Single, _11 As Single, _20 As Single, _21 As Single, _40 As Single, _41 As Single, _42 As Single, _50 As Single, _51 As Single, ByRef _Dataset As GrafikElementeDataSet)
    2. Dim element As GrafikElementeDataSet.ProfilRow = _Dataset.Profil.NewProfilRow()
    3. element.ElementTyp = ElementTyp
    4. element._10 = _10
    5. element._11 = _11
    6. element._20 = _20
    7. element._21 = _21
    8. element._40 = _40
    9. element._41 = _41
    10. element._42 = _42
    11. element._50 = _50
    12. element._51 = _51
    13. _Dataset.Profil.Rows.Add(element)
    14. End Sub


    Ich möchte mit diesem einem Sub jeden Table befüllen können.
    "Mann" lernt mit seinen Projekten.
    Oder anders gefragt: Wie kann Ich den DataTable variabel übergeben?

    Quasi so als ob ich einen String übergebe. (String1 & String2 & String3)
    Es gibt doch mit Sicherheit da eine Lösung!

    Es kann ja nicht sein, dass Ich für jedemn Table eine eigene Funktion benötige.
    "Mann" lernt mit seinen Projekten.
    Leider verstehe ich noch nicht ganz den Zusammenhang, aber EDR hat ein schönes Tutorial über Datasets erstellt, vielleicht hilft dir das weiter.
    https://www.vb-paradise.de/index.php/Thread/94955-die-vier-views-auf-video/#post798777

    Gruß

    Rattenfänger schrieb:

    EDR hat ein schönes Tutorial über Datasets erstellt

    Das stimmt. Das kenne Ich auch.
    Aber leider wird dies spezielle Problem dort nicht behandelt.

    Ich will es mal ohne Code versuchen zu erklären. Ev. geht das besser.

    Ich habe ein Dataset mit den Tables (Table1, Table2, Table3)

    Es gibt eine Form von der aus eine Funktion aufgerufen werden soll, welche zb. daten in einen der Table schreibt.
    Wie kann Ich jetzt aus der Form, der Funktion übergen welcher Table verwendet werden soll.
    Ich mochte ja nicht für jeden Table eine eigene Funktion schreiben.

    VB.NET-Quellcode

    1. Dim _Daten As DataSet.Table1lRow = Dataset.Table1.NewTable1lRow()


    Ich möchte das das irgendwie so nachher aussieht:

    VB.NET-Quellcode

    1. Dim _Daten As_Variable1 = _Variable2


    Ich denke die Kernfrage ist nach den Datentypen, die dort übergeben werden müssen.
    Ich habe da schon verschiedenes hin und her probiert, komme aber leider nicht weiter.

    Ev. wird es jetzt klarer was Ich suche.
    "Mann" lernt mit seinen Projekten.
    Ich glaube das prob wird im Video 1 gleich behandelt, dort wir über den Primarykey die Variable gleich weiter gegeben,sicher kannst du da ne Ableitung schaffen!?
    Ansonsten weiß ich leider nicht mehr !?!

    Counterbug schrieb:

    du kannst ihn ja in der Funktion in deine typisierte DataTable casten.


    Aber dafür muss doch die Funktion den Datentyp erstmal kennen.
    Objekt1DataTable oder Objekt2DataTable oder Objekt3DataTable

    Wie bekommt man es hin, das die Funktion weiß in was gecastet werden soll?

    @VB1963
    Ist eine gute Idee, bringt mir allerdings hintenrum wieder Arbeit, da Ich dann an anderen stellen Filtern muss um zb. nur explizit mit Objekt1 etwas zu machen.
    "Mann" lernt mit seinen Projekten.
    Den Datentyp kannst du dann über GetType() abfragen.

    Zum Beispiel so:

    Visual Basic-Quellcode

    1. 'Parameter: dt as DataTable
    2. If dt.GetType() = GetType(GrafikElementeDataSet.ProfilDataTable) Then
    3. Dim profileDT as GrafikElementeDataSet.ProfilDataTable = DirectCast(dt, GrafikElementeDataSet.ProfilDataTable)
    4. End If

    Danke, das ist auf jeden Fall eine Lösungsmöglichkeit für das Problem.
    Setzt aber auf jeden Fall voraus, das die Tablenamen bekannt sind.(Sind sie in diesem Fall ja.)

    Kann man den prinzipiell zb. "GrafikElementeDataSet.ProfilDataTable" als String übergeben und in der Funktion wieder zurück umwandeln?
    Oder gar ganze Anweisungen?

    @Counterbug
    Habe das mal gerade Probiert.

    Kann es sein, dass die Zuweisung nicht in eine If oder case anweisung verschachtelt werden darf?
    Ich komme nämlich dann nicht mehr an "profileDT" ran.

    "Mann" lernt mit seinen Projekten.

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

    Das Problem ist hier der Gültigkeitsbereich einer deklarierten Variablen.
    Die ist in deinem Fall nur im IF-Zweig gültig - d.h. du kannst sie nur dort verwenden.
    Bei typisierter Vorgehensweise kannst du aber eh nicht anders. Du musst für jede Tabelle eigens deinen Code schreiben, ausser du machst es untypisiert. Vielleicht ist es doch besser, die 3 Tabelle zusammenzufassen...
    siehe ähnliches Problem hier

    ErfinderDesRades schrieb:

    Jepp - diese Tabellen zusammenfassen. Es liegt eindeutig ein Fehler inne Datenmodellierung vor, und sowas macht halt Probleme.


    Ich beschreibe mal kurz was Ich mache, ev. habt Ihr ja einen anderen Lösungsansatz.

    Ich habe ein Panel in dem Ich mit dem PaintEvent zeichne.
    Es handelt sich dabei um mehrere dxf Dateien, welche Ich im vorfeld einlese und mir die nötigen Informationen mit den zu Zeichnenden Elementen in ein dataset schreibe.

    Es scheint so, dass jede Abfrage innerhalb des PaintEvents gewaltig auf die Performance geht.

    Deswegen wollte Ich jede dxf die gezeichnet wird in einen eigenen DataTable schreiben.
    Hätte den Vorteil, dass Ich jede Zeile des Tables verarbeiten kann ohne zu schauen, zu welchem Objekt es gehört.

    Denn je nach Objekt kann es sein, dass zb. eine andere Farbe verwendet oder eine verschiebeung gemacht werden muss.

    Deswegen wollte Ich nicht den Weg über einen Table gehen, wo Ich dann erst vergleichen muss, was Ich da überhaupt habe.

    Also: Nicht suchen, sondern finden!

    Ich werde jetzt auch mal Probieren für jedes Element ein eigenes Paint event zu machen und mir dann die Performance anschauen.

    Thema Performance: Auf meinem Rechner im Büro läuft der Kaspersky im Hintergrund, der scheint das alles auch nochmal gewaltig zu bremsen.
    "Mann" lernt mit seinen Projekten.
    Als "Abfrage" bezeichnet man Datenbank-Zugriffe. Ich weiß nicht, was Abfragen in diesem Sinne im Paint-Event verloren haben.
    Mir scheint, du hast dein Ownerdrawing ungut organisiert, wenn du da mit mehreren Panels rumfuhrwerkst, und wenn das laggt.
    guggemol activevb.de/cgi-bin/tippupload…ined_und_ziehbare_Schrift
    Das zeichnet auch, und ziemlich kompliziert, und aus verknüpften Tabellen und laggt nur wenig.
    Und würde man das angebundene Dgv noch "entbinden", wärs nochmal mehrfach schneller.
    Also mit vielen Tabellen bringst du die Performance nicht auf Vordermann.
    OK, binn dahinter gekommen, weshalb das so gewaltig gelaggt hat.
    Habe mir innerhalb des drawevents Werte aus textboxen der Form geholt. :whistling:

    Problem beseitigt. Jetzt funktioniert es auch inner Firma flüssig.

    Wieder besten Dank an alle, habt mich wieder auf den richtigen Weg gebracht. :thumbsup:
    "Mann" lernt mit seinen Projekten.