Zum Inhalt springen

c# .NET 2.0: DataGridView und dynamisches aktualisieren der Rows


afrokalypse

Empfohlene Beiträge

hi Leute,

ich habe einen kleinen Algorythmus geschrieben, welcher mir Textdateien von vorne nach hinten und umgekehrt zeilenweise auslesen kann.

Dieses kleine Progrämmchen wollte ich nun mit einer DataGridView verbinden sodass ich die Zeilen in einer Liste schön untereinander habe und jede einzelne Zeile anderweitig benutzen könnte.

Da ich durchaus Textdateien habe die ~500MB Speicherplatz verbrauchen können, ist es nicht sinnvoll alle Zeilen in den Speicher zu laden und sofort anzuzeigen. Deshalb hab ich mir vorgenommen immer nur 300 Zeilen in den speicher zu laden und in meine DataGridView zu füllen. Soweit kein Problem.

Wenn ich nun an einen bestimmten Punkt scrolle (zB > Zeilenposition 60)

dann soll jeweils die nächste Zeile in den Speicher geladen werden, am ende der DataGridView angelegt werden und die erste Row der DataGridView gelöscht werden. Auch kein Problem.

Wenn ich nun am Ende angekommen bin (die Textdatei am Ende ist) und ich wieder zurück scrollen will soll natürlich auch wieder die unterste Row entfernt und an die oberste Row die nächste zu ladende Zeile eingefügt werden.

Und hier entsteht das Problem. Wie ich an die richtige Zeile komme, weiss ich. Allerdings lässt sich hier nur die oberste Zeile anlegen aber NICHT die unterste Zeile entfernen. ich erhalte immer folgende Fehlermeldung:

'InvalidOperationExcepion wurde nicht behandelt: Die neue Zeile, für die kein Commit durchgeführt wurde, kann nicht gelöscht werden.'

Leider kann ich damit nicht viel anfangen. Wo liegt da der Fehler und was kann ich dagegen tun? Wenn ihr Codeschnippsel braucht dann sagt bescheid.

Ich benutze .Net 2.0, Visual c# 2005 Express und arbeite im Moment ohne Threads.

Vielen Dank für eure Hilfe schonmal im Voraus

Afr0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Afr0,

Wie geht bei Dir das Einlesen der Dateien vonstatten, also wie holst Du sie in Dein DataGridView? Hierzu wäre ein Codeschnipsel wirklich hilfreich! :)

Das DGV ist eigentlich und hauptsächlich für Datenbankoperationen gedacht, also bekommst Du diesen Fehler!

Eine Datenbanktransaktion wird in der bank erst dann wirksam, wenn Du sie mit dem Befehl "Commit" abschließt. Du kannst sie auch mit "Rollback" wieder rückgängig machen.

Dass Deinem DGV hierbei keine Datenbank zugrunde liegt, ist dabei egal, denn es hat - grob betrachtet - genau dieselben Beschränkungen, die eine DB auch hätte.

Nun versuchst Du, eine Zeile zu löschen, die Du innerhalb der Transaktion (für das DGV ist es eine solche!) erstellt hast, wieder zu löschen, ohne sie vorher zu committen.

Poste mal bitte den Code, wie Du an der Stelle die Zeile löschen und wieder anfügen willst!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Den Link kann ich nur weiter empfehlen:

Wenn Sie sehr umfangreiche Tabellendaten in einem DataGridView-Steuerelement anzeigen möchten, können Sie die VirtualMode-Eigenschaft auf true festlegen und die Interaktion des Steuerelements mit dem Datenspeicher explizit verwalten. Auf diese Weise können Sie die Leistung des Steuerelements in dieser Situation feiner abstimmen.

Das wäre in Deiner Situation äußerst ratsam, weil Du ja nicht mit einer Datenbank arbeitest!

Das Laden der Zeilen würde ich in eine eigene Klasse auslagern, der Du die Fähigkeit verleihst, an das DGV anzudocken!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe auch nicht gesagt, dass die Methode den Fehler behebt.

Es ist nur eine Empfehlung von mir einfach mehrer Daten in den Grid zu laden als 300

Deswegen verstehe ich nicht deine aussage:

..., weil Du ja nicht mit einer Datenbank arbeitest!

im Bezug auf Anzahl von Daten die in den Grid geladen werden bzw. sollen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach so, nein sie war gar nicht darauf bezogen! :)

Man kann durchaus weit mehr als 300 Datensätze in ein DGV laden, das ist kein Problem!

Dein Link beinhaltet allerdings auch einen Tipp, mit dem man das DGV dahingehend "besänftigen" kann, dass man Transaktionfehler wie den hier aufgetretenen nicht mehr bekommt.

Edit: @Afr0: Mir ist noch nicht ganz klar, wie Du die Löschung/ das Anfügen machst! Hierzu wäre etwas Code ganz hilfreich!

Link zu diesem Kommentar
Auf anderen Seiten teilen

hi leute :) sorry dass ich mich so spät erst melde.

das mit dem commit hab ich umgehen können.

dafür hab ich jetzt ein viel schwerwiegenderes problem :)

wenn ich wückwärts scrollen will, komme ich nicht mehr bis zum anfang meiner datei. das wird ein ganz einfacher logik-fehler sein den ich gemacht hab aber ich seh ihn nirgends. hier mal etwas code:


//Wenn hochgescrollt wird

                if ((e.Type == ScrollEventType.SmallDecrement) || (e.Type == ScrollEventType.LargeDecrement))

                {

                    //Wenn oberste angezeigte row kleineren index als 245 hat

                    if (this.dataGridView1.FirstDisplayedScrollingRowIndex < 245)

                    { 

                        //oa und oa2 sind umgewandelte datetimes die als text in der log-datei vorkommen

                        while (oa.Zeitpunkt != oa2.Zeitpunkt)

                        {

                            //hole dir das nächste datum von unten nach oben gelesen.

                            oa = this.alertLogReader.movePrevElement();

                            //wenn oa.zeitpunkt mit dem datum in der obersten row übereinstimmt

                            if (oa.Zeitpunkt == (DateTime)this.dataGridView1.Rows[0].Cells[0].Value)

                            {

                                //an row 0 eine row einfügen mit den neuen daten

                                this.dataGridView1.Rows.Insert(0, new object[] { this.alertLogReader.movePrevElement().Zeitpunkt });                                

                                //row löschen. es bleiben immer 301 rows übrig.

                                this.dataGridView1.Rows.RemoveAt(this.dataGridView1.RowCount - 2);

                                //wieder ein element runter gehen damit nicht versehentlich das gleiche datum aufgerufen wird

                                oa = this.alertLogReader.moveNextElement();                                

                                return;

                            }

                        }                        

                    }

                }  

            }

ich hoffe das erklärt sich soweit von selbst :) ist ein teil des scroll events.

Link zu diesem Kommentar
Auf anderen Seiten teilen

konnte leider nicht editieren deshalb doppelpost :/

mit dem virtualmode wird mir nicht viel bringen. ich muss durchaus schonmal 9000000 elemente anzeigen. wenn ich alle auf einmal anzeigen würde, würde es trotzdem viel zu lange dauern bis alle elemente geladen wurden. deshalb die dynamische ladefunktion. und ich kann ja auch durchaus bis zu 10000 elemente anzeigen das wäre noch kein problem aber trotzdem danke für den tipp mit virtualmode. so aber was kann ich jetzt mit meinem code da machen dass mein hochscrollen funtzt? :confused:

das hier scheint wohl eher für mich interessant zu sein :D

http://msdn2.microsoft.com/de-de/library/ms171624.aspx

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm, Deinem Code zufolge würde ich jetzt mit einem Indexfehler rechnen.

An einigen Stellen habe ich mich schon sehr geärgert, dass manche vordefinierten Indizes bei 0 beginnen und andere dann wieder bei 1.

Wie weit kommst Du denn auf den Anfang zurück? Einige Zeilen? Was passiert? Wird Dir als erste Zeile eine angezeigt, die nicht die erste ist?

Inzwischen würde ich schon fast dazu übergehen, ein Usercontrol zu entwerfen, bei dem man die Zeilen direkt mit angeben kann. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...