Announcement

Collapse
No announcement yet.

Linq-Abfrage: direkt an DataSet.Tables.Columns anstatt in DataGridView

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Linq-Abfrage: direkt an DataSet.Tables.Columns anstatt in DataGridView

    Hallo,

    Meine Frage aus dem geschlossenen Beitrag hat sich erledigt, es stellt sich nun eine neue Frage:
    Ich übergebe folgende Abfrage an ein Datagridview und reiche die Daten von dort an die DataSet.Tables[].Columns weiter. Frage: Gibt es eine Möglichkeit, ohne diesen Umweg das DataSet zu befüllen ? Hinweis: Die Anzahl der Tabellen sowie die Anzahl der Spalten kommen aus ständig wechslenden XML-Dateien und werden erst zur Laufzeit bekannt.

    Danke für eine Antwort.


    Hier der Code bis zur Befüllung des DataGridView:
    [highlight=c#]
    var q = from ex in variableColumns
    select new { Name = ex.Element("Name").Value.ToString() };
    foreach (var item in q.ToList())
    {

    dataGridView1.DataSource = q.ToList();
    }
    [/highlight]
    Anmerkung: Die Tabellen sind zu diesem Zeitpunkt bereits im Dataset angelegt, es müssen eben noch Spalten und ihre Namen hinzugefügt werden.
    Zuletzt editiert von gfoidl; 04.06.2011, 12:23. Reason: C#-Tags

  • #2
    Ich habe die Frage vermutlich nicht ganz verstanden. Mehr Details würden helfen.

    Du hast ein Satz von XML Dateien als Datenquelle und möchtest die als DataTables in ein DataSet überführen? Und aus irgendeinem Grund hast du für diesen Vorgang ein Grid dazwischengeschaltet und jetzt möchtest du das Grid loswerden? Habe ich das richtig verstanden/erraten?

    Wenn dem so ist warum ist deiner Meinung nach das Grid nötig? Ich sehe keinen Grund und dein Code gibt da auch nix her. Und warum willst du überhaupt mit deinen Daten in ein DataSet? Ist das XML unglücklich strukturiert? Oder?

    Comment


    • #3
      Hallo Ralf,

      Du hasst es richtig erkannt, die XML-Datei ist
      1. tatsächlich unglücklich struckturiert
      2. überhaupt nicht einheitlich
      Es handelt sich um die XML-Datei, die von Buchhaltungsprogrammen uneinheitlich erstellt wird.
      Der Versuch, die XML-Datei sofort ins DataSet zu laden, scheidert kläglich. Die Anzahl der Tabellen, die Anzahl der Spalten, die Namen der Tabellen, ... nichts ist einheitlich und bekannt. Ich bin mit meinem momentanen Ergebnis eigentlich zufrieden, ich laden die Daten in DataGridView's und reiche sie dann an die im Dataset angelegten Tabellen weiter.

      Die Frage nach der Möglichkeit, die Daten direkt an ein DataSet zu schicken, ist ein Verständnisfrage. Ich möchte Linq besser verstehen. Mit dem Codeausschnitt frage ich z.B. die Namen der Tabellen in der XML-Datei ab und gehe dann die DataGridView mit einer foreach-Schleife durch und lege
      1. die Tabellen im DataSet an
      2. addiere dann die Columns mit ihren Namen
      3. füge dann die Daten ein, die sich in separaten CSV-Dateien befinden.

      Nun könnte man daran denken, ohne Umstand die CSV-Dateien direkt zu verarbeiten, die haben jedoch keinen Spaltenkopf (also ohne Punkt 2)

      Gruß
      Walter

      Comment


      • #4
        Hallo,

        da hast du ja eine super Aufgabe

        Erstmals sollte unbedingt Logik und Darstellung getrennt werden bzw. getrennt bleiben. D.h. das DataGridView für die Umwandlung, etc. zu Verwenden ist Vergewaltung dessen - es soll ausschließlich zur Anzeige von Daten verwendet werden und dort idealerweise per Datenbindung.

        Was ich nicht verstanden habe ist wozu das DataSet benötigt wird. Meines Erachtens nach hat sich der Verwendung von DataSets erübrigt. Auch hier denke ich dass es besser ist eigene Klasse zu erstellen. Erst recht da die "Spalten" (-> Eigenschaften in den Klassen) unterschiedlich sind. Daher erstelle eine Basisklasse die als Eigenschaften alle gemeinsamen Spalten hat. Und dann einen Satz von Unterklassen welche die Spezialisierung darstellen - also für jedes Buchhaltungssystem eine Unterklasse. Jede dieser Unterklassen hat auch eine Methode XmlEinlesen denn - so weiß jede Klasse ganz genau wie sie das spezielle XML einlesen muss.

        Diese Klassen können dann für alles erdenkliche weiterverwendet werden: Speichern in der Datenbank, Reporting, ...

        Wo dann die CSV hinzukommen habe ich auch nciht verstanden, aber zeichne dir am besten die Klassen auf und überlegen wo es besten reinpasst - oder ob eine neue Klasse (ein Service) dazu notwendig.

        Ich hoffe du verstehst wie ich es als groben Überblick darstellen will.



        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Ich bin mit meinem momentanen Ergebnis eigentlich zufrieden, ich laden die Daten in DataGridView's und reiche sie dann an die im Dataset angelegten Tabellen weiter.
          Ja aber warum? Wenn du das Dataset aus der in XML definierten Struktur erzeugt hast warum schreibst du die Daten aus dem csv dann nicht direkt ins Dataset? Ich verstehe immer noch nicht denn Sinn des DataGridView. Es kommt mir sogar komplizierter vor das DataGridView da irgendwie unter zu bringen. Und warum überhaupt Datasets/Datatable? In deinem Code wäre q.ToList() doch eine Liste in dem benötigten Format oder. Warum schreibst du die Daten nicht einfach in diese Liste und arbeitest mit der?


          Die foreach Schleife in deinem gezeigten Code ist übrigens überflüssig. Du bindet die Liste an das Grid nicht eine Zeile aus der Liste. Es gibt also keinen Grund die selbe Bindung für jede Zeile vorzunehmen. Einmal reicht völlig.

          Comment


          • #6
            Zunächst Danke für die Antwort. Dass ich das DataGridView zunächst missbrauche, ist mir klar. Allerdings kann ich so am besten nachverfolgen, was beim Einlesen der Daten passiert.
            Ich erkenne nicht, warum sich das DataSet erledigt haben soll. Die Daten, die dort gesammelt werden, sollen letztlich sondiert werden und dann an Excel übergeben und dort betriebwirtschaftlich ausgewertet werden.

            Dennoch: ich bin für jeden Tipp dankbar.

            Anmerkung zur Anwort von Ralf: mein Punkt 3. ist schon so zu verstehen, dass ich die CSV-Daten dann direkt ins DataSet schreibe.

            Gruß
            Walter
            Zuletzt editiert von Walter Zimmermann; 04.06.2011, 20:08.

            Comment


            • #7
              Hallo,

              Ich erkenne nicht, warum sich das DataSet erledigt haben soll
              Weil es beim DataSet/DataTable im Gegensatz zu eigenen Klassen nicht möglich ist denen ein Verhalten mitzugegen. Kurz: mit eigenen Klassen bist du flexibler. Das was ich oben geschrieben habe geht mit DataTables nicht.

              Dass ich das DataGridView zunächst missbrauche, ist mir klar. Allerdings kann ich so am besten nachverfolgen, was beim Einlesen der Daten passiert.
              Etwas provokant gefragt: Kennst du den Debugger?

              Ich hab das Gefühl dass du es dir unnötig schwer und komplliziert machst. Mach eine kurze Pause und dann nimm ein Blatt Papier und zeichne auf was mit den Daten wie geschehen soll. So entsteht ein Modell und das setzt du dann in Code um - ein DataGridView ist dazu nciht notwendig.
              Zerleg dabei die Aufgabe in kleine überschaubare Teilaufgaben und löse jede für sich.



              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment

              Working...
              X