Laden...

dataGridView: Ursprung wiederherstellen/Reset

Erstellt von frameFritzz vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.355 Views
F
frameFritzz Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren
dataGridView: Ursprung wiederherstellen/Reset

Einen wunderschönen Nachmittag,

ich arbeite derzeit an meiner Studienarbeit, und bin nun an einem Punkt angekommen an dem ich nicht mehr weiter weiß.
Ich wende mich deshalb an euch.

Zu meinem Projekt:
Ich lade Daten aus einem File, und stelle diese Daten dann in einer DataGridView dar. Anschließend können die Daten(Zellen) mit Hilfe von Drag'nDrop beliebig in der DataGridView bewegt werden.
Bis hier funktioniert alles Tadellos.

Das Problem:
Ich möchte nun die Möglichkeit einbauen, einen Reset durchzuführen, welcher nach beliebigen Drag'nDrop-vorgängen den Ursprungszustand der eingelesenen Daten wiederherstellt.
Ich möchte nach Möglichkeit aber nicht noch einmal auf die eingelesenen Daten zugreifen, da ich Daten und Darstellung gerne soweit wie möglich trennen möchte bzw. unabhängig von einander halten.

Der Versuch ein Array zur zwischen Speicherung der einzelnen Rows hat sich als nicht brauchbar herausgestellt, da wohl im Hintergrund keine wirkliche Kopie sondern nur ein Verweis erstellt wird. Und die Änderungen in der DataGridView mit im Array gespeichert werden.


        //Deklaration des Zeilen/Row Arrays
        DataGridViewRow[] saveGridViewRows;


        //Initialisierung des Arrays(Später im Quelltext, nachdem Größe bekannt ist.)
        //Dies geschieht kurz nachdem die Daten aus dem File eingelesen wurden. Definitiv vor dem ersten möglichen Drag'nDrop vorgang
        saveGridViewRows = new DataGridViewRo[dataGridView1.Rows.Count];

        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
               saveGridViewRows[i] = CloneWithValues(this.dataGridView1.Rows[i]);
        }

        //Methode zur Zuordnung der Zellen, zu den entsprechenden Zeilen
        private DataGridViewRow CloneWithValues(DataGridViewRow row)
        {
            DataGridViewRow clonedRow = (DataGridViewRow)row.Clone();
            for (Int32 index = 0; index < row.Cells.Count; index++)
            {
                clonedRow.Cells[index].Value = row.Cells[index].Value;
                clonedRow.Cells[index].Style.BackColor = row.Cells[index].Style.BackColor;
            }
            return clonedRow;
        }
        
        //Auslösen des Reset via Button
        private void button3_Click(object sender, EventArgs e)
        {
            doGridReset();
        }

        //Methode welche den eigentlichen Reset durchführt. Die "alten" Daten wieder in die DataGridView lädt
        private void doGridReset()
        {
            //Zurückstellen, der DataGridView auf den Ursprünglichen File-stamm.
            //Test implementierung, für gridview1.
            this.dataGridView1.Rows.Clear();
            
            int length = saveGridViewRows.Length;
            for (int i = 0; i < length; i++)
            {
                dataGridView1.Rows.Add(saveGridViewRows[i]);
            }

        }

Der hier gezeigte Code funktioniert leider auch nicht wirklich sondern führt erstaunlicherweise nur zum zurücksetzen des Drag'nDrop Schrittens vorher. Aber eben leider nur genau einen Schritt.
Ich hoffe ihr könnt mir helfen, den Fehler zu finden. Oder habt eine bessere Lösung. =)

Vielen Dank bereits im Vorraus

Grüße frameFritzz

F
10.010 Beiträge seit 2004
vor 9 Jahren

Oder habt eine bessere Lösung. =)

Ja, das ganze gefrickel mit den Daten im Control sein lassen und eine DataTable anlegen.
In der kannst du die Daten verwalten und sie an das DGV ( und auch andere Controls ) binden.

Da die DataTable auch ein CancelEdit hat, ist das mit dem Rückgängig auch einfach.

Das fällt aber alles unter [Hinweis] Wie poste ich richtig? Punkt 1.1

T
708 Beiträge seit 2008
vor 9 Jahren

Wie FZelle schon andeutet, ist es wichtig die Daten aus der Datei erstmal in ein Objekt zu übertragen.
Damit erzeugt man eine Trennung zwischen der Anzeige und der Daten.

Er schlägt eine DataTable vor. Man kann aber auch eine X-beliebige Collection verwenden und der DataSource des DataGridViews übergeben. Optimaler weise per DataBinding.
Vielleicht hilft das hier schonmal zum Verständnis weiter:
A Detailed Data Binding Tutorial

F
frameFritzz Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren

Vielen dank,

das mit der der DataTable klappt.

grüße frameFritzz