DataGridView sinnvoll und effizient befüllen

  • C#

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

    DataGridView sinnvoll und effizient befüllen

    Hi Leute,

    zuerst mal zur Struktur meines Programmteils:
    Ich habe eine Liste von Objekten des Typs "State". Dieser Typ "State" besteht einmal aus der Property "Name" und einer Liste von Objekten des Typs "Instruction". Dieser Typ hat fünf Properties, von denen aber nur zwei für mein Problem relevant sind.
    Des Weiteren habe ich noch ein Liste mit Strings, die zusätzlich benötigt wird.

    Nun zu meinem Problem:
    Das DGV soll meine vorhandenen Daten nach folgendem Muster ausgeben:
    • Die Spaltentitel sollen mit den Elementen aus der String-Liste befüllt werden.
    • Jede Zeile soll nun als Header den Inhalt der Property "Name" (ein String) eines "State"-Objekts beinhalten. Nun ist es so, dass sich der Inhalt der Property "Read" eines der "Instruction"-Objekte mit einem Element aus der String-Liste deckt, sich also einer Spalte zuordnen lässt. Jede Zelle soll also den Inhalt der Property "String" eines "Instruction"-Objekts beinhalten, dessen Property "Read" gleich dem Spaltentitel ist.
    Ich stehe ideentechnisch gerade akut aufm Schlauch und mir will einfach keine einfachere Lösung einfallen, als das DGV mühsam per Code zu befüllen und die entsprechenden Zuordnungen zu finden. Nun meine Frage: Ist es evtl. möglich mein DGV auch gebunden zu füllen? Das würde im Programm nämlich einiges vereinfachen.
    Ich meinte eigentlich die grauen Felder links und oben im DGV. Wenn ich das richtig verstanden habe, kann man den Inhalt dieser Zellen mit Row.HeaderCell.Value und Column.headerText verändern.
    Bei dem was ich bis jetzt probiert habe, funktioniert das auf jeden Fall über die Eigenschaften:

    C#-Quellcode

    1. ​foreach (string s in alphabet) { DataGridViewMachine.Columns.Add(s, s); }
    2. foreach (State s in machine)
    3. {
    4. DataGridViewRow dgvr = new DataGridViewRow();
    5. dgvr.HeaderCell.Value = s.Name;
    6. DataGridViewMachine.Rows.Add(dgvr);
    7. }


    Nun ist bloß die Frage, ob ich mir noch was überlegen muss, um die "String"-Properties den Zellen zuzuordnen oder ob ich mir das alles auch sparen kann, indem ich das über Bindings löse. Ich wüsste bloß nicht im geringsten wie (Wie Bindings im Allgemeinen funktionieren, weiß ich aber schon).
    Tatsache - geht.

    Aber willst du nicht doch lieber RowHeaderVisible.False stellen, und stattdessen eine ordentlich bindebare Column einführen? Per ColumnDefaultStyle kannste die ja auch so grau machen, dann sieht die fast aus wie ein RowHeader.
    Und wennde die Column freezest und readonly machst, verhält sie sich auch fast so.
    Gute Idee! Danke schon mal dafür. Wie kann ich meine String-Liste denn aber so binden, dass die erste Spalte leer bleibt? Muss ich dann der String-Liste ein leeres Feld voranstellen?

    Um mal Klartext zu reden: Das DGV soll mit Daten so aussehen wie eine Zustandstabelle für eine Turing-Maschine. Bei meinem Interpreter läuft nun halt alles außer die anständige Darstellung der Zustandstabelle. Vielleicht hilft das ja bei der Vorstellung ja ein bisschen.
    hmm - Klartext - äh - also ich weiß, dass es Touringmaschinen gibt, und dass die kein Motor haben... :rolleyes:

    Das mit deine abgetrennten Strings und das ganze Theater habich garnet verstanden.
    Ich halte aber für höchstwahrscheinlich, dasses kein Problem ist, die Strings in einer 2. Tabelle des Datasets zu halten, und eine Relation zu setzen, und dann hat man alles in einem Datenmodell, und sone Anzeige ist Datengebunden und PillePalle.

    Studiere mal Datenverarbeitungs-Vorraussetzungen, Punkt 5 + 6.

    Das müsste eigentlich das Werkzeug skizzieren, wie man auch für eine TouringMaschine ein relationales Datenmodell erstellt. Dann kann man sicher auch sone ZustandsTabelle präsentieren.
    Also wenn ich deine Erklärungen richtig verstanden habe, dann ist das Modell zwar für eine Turing-Maschine perfekt geeignet, jedoch nicht für einen Interpreter. Dieser muss ja flexibel sein und demnach müsste ich dann flexibel im Code das Datenmodell anpassen bzw. verändern. Im Grundlegenden funktioniert eine Turing-Maschine so, dass es zu einem Zustand und einem von einem Band eingelesenen Zeichen eine entsprechende Handlungsanweisung gibt, wie die Maschine weiter zu verfahren hat (zu schreibendes Zeichen, eine Kopf-/Bandbewegung und ein neuer Zustand). Ich möchte nun flexibel veränderbar eine Tabelle haben, die in den Spalten die einlesbaren Zeichen anzeigt (meine String-Liste) und in den Zeilen die Zustände (die "Name"-Property des "State"-Objekts). Die Zellen sollen nun die Handlungsanweisung ("String"-Property des "Instruction"-Objekts) enthalten, die sich aus dem in der Zeile befindlichen Zustand und dem in der Spalte stehenden eingelesenen Zeichen ergibt bzw. sich diesen zuordnen lässt.

    Vielleicht ist auch das DGV der falsche Ansatz und ich sollte es einfach über zwei Listboxen lösen. Die lassen sich einfacher an die Listen binden und die Zuordnung sind dann auch nur ein paar Zeilen Code.