vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
DataGridView 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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.






Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel