| |
VB.NET - Ein- und UmsteigerDataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 14.10.15 17:28 |
| Hallo,
Beim Start meines Programmes werden die Haupt-Tabellen mit den wichtigsten Informationen
von der Datenbank (MSSQL) gelesen und in einem DataSet abgelegt, jeweils in eigenen Tabellen.
Zur Anzeige der Daten verwende ich im Hauptfenster ein DataGridView.
Über ein vertikales Menü kann ich die einzelnen Datengruppen auswählen.
Zum Wechseln der Informationen tausche ich im DataGridView nur den Namen der Tabelle aus dem DataSet.
Mit wenigen Records funktioniert dies auch wunderbar.
Nun habe ich aber 2000 Records in einer Tabelle. Recordlänge etwa 500 Bytes
Der Wechsel auf diese Tabelle im DataGridview dauert sehr lang. Etwa 8 Sekunden bis zur Anzeige
Auch das Sortieren der einzelnen Spalten benötigt seine Zeit. Etwa 3 Sekunden.
Nur das Filtern in den Records geht außergewöhnlich schnell. Das Ergebnis ist unmittelbar da.
Mir ist bewußt, dass die Verarbeitung Zeit benötigt.
Aber flotter könnte es schon gehn.
Das alle relevanten Daten beim Start des Programmes geladen werden, sollte schon bleiben. Ist auch eine Vorgabe
Jetzt meine Fragen:
Welche Fehler sollte man unbedingt vermeiden für eine flotte Verarbeitung!
Welche Möglichkeiten gibt es zur Verbesserung der Lage
Viele Grüße
spatzimatzi
| |
Re: DataGridView und die Geschwindigkeit | | | Autor: Manfred X | Datum: 15.10.15 06:41 |
| Hallo!
Du erwartest Hinweise zur Optimierung eines Quell-Codes, zu dem Du nichts mitteilst?
Diese geringe Anzahl von Datensätzen (2000) erlaubt den Wechsel der Tabelle innerhalb
von Sekundenbruchteilen. Das gilt auch für das Sortieren nach den Werten einer Spalte.
Wenn sich diese Operationen bei Dir so lange hinziehen, hast Du vielleicht Eventhandler
für gebundene Controls eingerichtet, die beim Laden (z.B. für jede Zeile/Zelle) aufwendigen
Code ausführen oder eine Ereigniskette programmiert, durch die der Lade- bzw. Sortiervorgang
mehrmals hintereinander stattfindet.
[I]Zum Wechseln der Informationen tausche ich im DataGridView nur den Namen der
Tabelle aus dem DataSet.[/I] ?????
Das Datagridview-Control, die Bindingsource und die Datatable bieten eine große
Fülle von Properties und Events. Ohne genaue Angaben zu Deiner Vorgehensweise sind
deshalb keine gezielten Hinweise möglich.
| |
Re: DataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 15.10.15 09:02 |
| Hallo Manfred X,
vielen Dank für deine Antwort.
Ich hatte gehofft, dass mir jemand allgemeine Auskünfte gibt.
Deine Aussage, dass 2000 Records ratzfatz verarbeitet werden können, ist eine solche Antwort und zugleich eine wertvolle.
Jetzt weiß ich, das ich Fehler in meinem Code habe und gezielt danach suchen muss.
Vielen Dank
spatzimatzi | |
Re: DataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 15.10.15 12:13 |
| Hallo Manfred X,
habe eine Stelle gefunden, wo viel Zeit verbraten wird. Verstehen tu ich es nicht.
Habe mir die Zeit vor und nach der Schleife ausgegeben lassen und errechne etwa 8 Sekunden
Genauer könnte ich dies mit Ticks machen, aber ich denke, dass ist nicht notwendig.
Ich hatte geschrieben, dass ich über eine vartikale Menüleiste die einzelnen Gruppen, die angezeigt werden sollen, auswähle. Darunter ist auch die Gruppe mit den 2000 Records.
Das DataGridView, das angezeigt wird, heisst dgvDaten
Die Spaltendaten wie Name, Position und Breite werden für jede Gruppe gespeichert.
Bei einer neuen Gruppe müssen dann diese Daten gelesen und zugeordnet werden.
Die Informationen stehen in der Variablen XYZ und sehen wie folgt aus:
ArtikelIdent:0:100;Artikelnummer:1:94;DelFlag:11:100;Matchcode:3:100;SoundexID:10:100;Artikelbezeichnung1:4:154;Artikelbezeichnung2:5:151;Serienbezeichnung:9:165;MerkmalText:8:188;Warengruppe:6:139;Status:2:30;PreisText:7:161;Zusatz_KurzBezeichnung:17:100;Zusatz_KurzBezeichnungNummer:16:100;Zusatz_ArtikelNummer:12:100;Zusatz_ArtikelBezeichnung1:13:100;Zusatz_SerienBezeichnung:14:100;Zusatz_WarenGruppe:15:100
Nicht alle Spalten werden angezeigt, aber benötigt!
Habe im Debugmodus die einzelnen Schritte ausgeführt. Keinerlei Verzögerung.
Starte ich das Programm, dann benötigt das Programm diese 8 Sekunden zwischen den Zeit-Ausgaben.
Debug.Print("Start:" & DateTime.Now.ToString)
Dim strSpaltenwerte() As String = XYZ.Split(";"c)
For Each i As String In strSpaltenwerte
Dim strWerte() As String = i.Split(":"c)
If dgvDaten.Columns(strWerte(0)) Is Nothing Then Continue For
If strWerte(1) > dgvDaten.ColumnCount - 1 Then Continue For
With dgvDaten.Columns(strWerte(0))
.DisplayIndex = strWerte(1)
If .AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet OrElse _
.AutoSizeMode = DataGridViewAutoSizeColumnMode.None Then
.Width = strWerte(2)
End If
End With
Next i
Debug.Print("Ende:" & DateTime.Now.ToString) Hinweis: Die Anweisung .Width = strWerte(2) im Code If . AutoSizeMode ... schluckt die Zeit, aber warum?
Die Abfrage wurde eingebaut, weil bei DataGridViewAutoSizeColumnMode.Fill nicht gesetzt werden kann bzw. soll
Meine Fragen, auch allgemeiner Art:
Ist die Zeitmessung richtig?
Hat die Zuordnung auch Einfluss auf die einzelnen Records? Wenn ja: Welche Ereignisse?
Gibt es Grundsätzliches, was man bei der Zuweisung beachten muss?
..Evtl eine bestimmte Reihenfolge einhalten?
Kann man die Spaltenangaben geschickter und vor allem schneller zuweisen?
Wenn noch Fragen sind, her damit. Ich beantworte sie gerne!
Bin für jede Information dankbar!!
Viele Grüße
spatzimatz | |
Re: DataGridView und die Geschwindigkeit | | | Autor: Manfred X | Datum: 15.10.15 14:25 |
| Hallo!
Die Tücke steckt in der AutoSizeMode-Eigenschaft.
Wird sie gesetzt, dauert der Vorgang eine digitale Ewigkeit.
Du kannst als Alternative die angepaßte Spalten-Breite per Code ermitteln.
Das geht recht fix.
Sei dgv ein datagridview, das an eine DataTable gebunden ist ...
dgv.Font = New Font("Arial", 10)
Using g As Graphics = dgv.CreateGraphics
g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
For c As Integer = 0 To dgv.Columns.Count - 1
Dim sz As SizeF, maxwidth As Integer, vl As Object, content As String
Dim fo As Font = dgv.Columns(c).DefaultCellStyle.Font
If fo Is Nothing Then fo = dgv.Font
maxwidth = 10
For r As Integer = dgv.Rows.Count - 1 To 0 Step -1
vl = dgv.Rows(r).Cells(c).Value
If vl IsNot Nothing Then
content = vl.ToString & ".."
sz = g.MeasureString(content, fo)
maxwidth = CInt(Math.Max(sz.Width, maxwidth))
End If
Next r
dgv.Columns(c).Width = maxwidth
Next c
End Using | |
Re: DataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 15.10.15 15:39 |
| Hallo Manfred X,
vielen Dank für das Script, für die Arbeit.
Entschuldigung, aber ich verstehe nur Bahnhof.
Mit meinem Basic-Wissem kann ich keine große Sprünge machen.
Das was ich erstelle, habe ich meist durch ausprobieren hinbekommen.
Ich möchte nur, das beim Eröffnen einer Datengruppe die einzelnen Spalten
so aussehen, wie sie beim letzten Aufruf hinterlassen wurden.
Du hast sicherlich viel Arbeit in das Script gesteckt. Toll
Aber ich sehe nirgends, wie die Spalten in der Breite gesetzt werden.
Kann man vielleicht erklären, was da überhaupt abläuft.
Muss denn mein Script durch dein Script ersetzt werden?
Vielen Dank
spatzimatzi | |
Re: DataGridView und die Geschwindigkeit | | | Autor: Manfred X | Datum: 15.10.15 15:52 |
| Du fragst in Deinem Code die Autosizemode-Eigenschaft der Spalten ab.
If .AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet OrElse _
.AutoSizeMode = DataGridViewAutoSizeColumnMode.None Then
.Width = strWerte(2) Ist diese Eigenschaft nicht gesetzt (NotSet) gibt es dadurch keine
Performce-Probleme.
Ich vermute aber - wegen dieser Abfrage -, daß in Deinem Code irgendwo
die Eigenschaft auf AllCells(Exceptheader) gesetzt wird.
Das würde Deine Performance-Probleme erklären.
Der Code den ich gepostet habe, ist eine Alternative zum Setzen der
Spalteneigenschaft "AutoSizeMode" auf den Wert "AllCellsExceptHeader".
Er ersetzt also nicht den Code, den Du gepostet hast.
| |
Re: DataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 15.10.15 16:30 |
| Hallo Manfred X,
ich weiß noch nicht, ob es super läuft, aber es läuft gut.
Bei der Beschreibung der Spalten hatte ich folgende Angabe:
dgvDaten.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders Diese Angabe bezieht sich jedoch auf die Zeile und nicht auf die Spalte
Nachteilig ist jetzt, dass sich die Zeilenhöhe nicht mehr anpasst. Und das brauche ich unbedingt.
Wenn ich das mit deiner Hilfe noch hinkriegen würde, dann könnte ich von "Super" reden
Vielen Dank
spatzimatzi | |
Re: DataGridView und die Geschwindigkeit | | | Autor: Manfred X | Datum: 15.10.15 17:13 |
| Eventuell Beschränkung auf die aktuell angezeigten Zellen ....
dgv.AutoSizeRowsMode = _
DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders Die Anpassung der Zeilenhöhe wird dann während der Benutzung
des Grid bei Bedarf ständig aktualisiert - weniger empfehlenwert.
| |
Re: DataGridView und die Geschwindigkeit | | | Autor: spatzimatzi | Datum: 16.10.15 09:26 |
| Hallo Manfred X,
deinen Tipp habe ich umgesetzt und bin sehr zufrieden.
Das System zeigt die Daten richtig und flott an.
Letzte Frage: Warum ist es weniger empfehlenswert, die Einstellung DisplayedCellsExceptHeaders zu wählen?
Vielen, vielen Dank
spatzimatzi | |
Re: DataGridView und die Geschwindigkeit | | | Autor: Manfred X | Datum: 16.10.15 09:47 |
| Hallo!
Das DatagridView wird gewöhnlich eingesetzt, damit der Benutzer sich
rasch einen guten Überblick über den Inhalt einer Datentabelle verschaffen
kann (Scrollbars etc.)
Um dies zu ermöglichen, sollte in der Anzeige jeweils ein genügend großer
Abschnitt von Daten-Zellen sichtbar sein.
Wenn man automatische Anpassungen der Spaltenbreite oder der Zeilenhöhe vornimmt,
kann diese Ansicht unübersichtlich werden.
Es werden eventuell nur noch wenige Zellen angezeigt oder manche Zeilen wirken
"hervorgehoben", weil sie in größerer Höhe dargestellt sind.
Ich bevorzuge deshalb eine einheitliche Zeilenhöhe und bei Spalten lege ich eine
maximal zulässige Breite fest.
Auf dem Formular kann man neben dem Grid geeignete Box-Controls verwenden
(Rich-Textbox, Picturebox, ....), die bei Bedarf den gesamten Inhalt der aktuellen
Zelle darstellen oder die an Spalten mit "übergroßen" Inhalten gebunden sind.
Und es gibt sowas ...
Private Sub dgv_EditingControlShowing(sender As Object, _
e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
Handles dgv.EditingControlShowing
If TypeOf e.Control Is TextBox AndAlso _
e.CellStyle.WrapMode = DataGridViewTriState.True Then
Dim textBox As TextBox = DirectCast(e.Control, TextBox)
textBox.ScrollBars = ScrollBars.Both
End If
End Sub
Beitrag wurde zuletzt am 16.10.15 um 10:09:56 editiert. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|