Datagridview während des Füllens aktualisieren und Zugänglich machen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    Datagridview während des Füllens aktualisieren und Zugänglich machen

    Hallo!

    Ich habe ein Datagridview das ich mit über 5000 Einträgen füllen möchte!
    Das DGV ist an eine DataTable gebunden in das ich die Daten schreibe.

    Die Routine zum Füllen besteht aus einer Schleife die Daten von der Festplatte liest und in das DataTable schreibt..das ganze über nen BackgroundWorker damit ich die Form noch bedienen kann!
    ..da das gesamte füllen des Tables mehrere Minuten dauert wollte ich gerne ein Zeilenweises hinzufügen der Daten realisieren!

    Ich kann jetzt zwar das DGV zeilenweise füllen, habe aber kein Zugriff auf das eigentliche DGV..d.H. ich kann nicht scrollen!

    Wenn ich zwischendurch, per Knopfdruck, manuell eine Zeile zum DGV hinzufüge erhalte ich die gewünschte kontrolle, also ich kann ganz normal im DGV scrollen, markieren etc. noch während sich das DGV füllt!

    Woran kann es nun liegen das ich in der Schleife keinen direkten Zugriff auf das DGV habe?

    Ich hab schon probiert in der Schleife ein "Application.DoEvents" einzufügen, ebenso eine Invoke.Invalidate wie Invoke.Refresh etc. NIX!

    Nur nach dem manuellen hinzufügen eines Eintrags während des "Füllens" erhalte ich Zugriff auf das DGV!

    Hat jemand nen Tip? Oder eine Lösung zum Zeilenweisen füllen??
    Ich hab bei mir ähnliches gemacht. Bei mir kann man während dem Laden der Daten ins Grid darin Dinge tun... ich lade die Daten in eine DataTable, welche als DataSource an das Grud gebunden ist.

    Damit das schön funktioniert, lade und verarbeite ich die Daten asynchron und füge diese dann in die DataTable ein. Dies geschieht
    mit BeginInvoke..

    Jetzt stellt sich mir die Frage, wie machst du das ganze? Code währe hilfreich.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hi. Vielleicht kann ich was beitragen.

    Ich hatte auch das Problem, dass das Füllen "ewig dauert"
    Nach etwas "basteln" benutze ich unteren Code seit langem.

    er füllt das Grid mit momentan 2400 Adress-Daten in etwa 2 Sekunden (mit 12 Feldern pro Datensatz)
    Ich öffne nur die DB habe aber keine Bindungen oder Datasets aus der Werkzeug-Kiste eingefügt.

    Die Routinen shene immer ähnlich aus, ich weiß nicht mehr, was ich geändert habe, dass es jetzt so
    schnell geht. Ist mir aber jetzt egal :)

    Mein Code:
    Sub Retrievdata befüllt die Grid mit Daten
    Sub SetupDBGrid (solte vorher aufgerufen werden) stellt ein paar Dinge am Grid ein.
    Die Namen/Feldnamen müssten natürlich noch angepasst werden..

    '//--------------------------------------------------

    '// Initialisiere DataGridView @RunTime
    Private Sub SetupDBGrid()
    Dim i
    With DBGrid
    .RowHeadersVisible = False
    .AllowUserToAddRows = False
    .AllowUserToDeleteRows = False
    .AllowUserToResizeRows = False
    .AllowUserToResizeColumns = True
    .MultiSelect = False
    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    .ReadOnly = True
    .Font = New Font("Tahoma", 9)
    '// Columns hinzufügen (SYNTAX: "FELDNAME", "ANZEIGENAME")
    .Columns.Add("Kindex", "Kindex")
    .Columns.Add("Nachname", "Name")
    .Columns.Add("Vorname", "Vorname")
    .Columns.Add("PLZ", "PLZ")
    .Columns.Add("Ort", "Ort")
    .Columns.Add("Strasse", "Straße")
    .Columns.Add("Tel1", "Tel. Privat")
    .Columns.Add("Tel2", "Tel. Mobil")
    .Columns.Add("Fax", "Fax")
    .Columns.Add("Mail", "E-Mail")
    .Columns.Add("Notiz", "Notiz")
    .Columns.Add("AllowMail", "Mail erlaubt")
    .Columns.Add("TelFirma", "Tel. Firma")

    '// Coulumns, die nicht angezeigt werden sollen (z.B. DB-Index)
    '//Man kann diese trotzdem lesen und schreiben
    .Columns(0).Visible = False '// KINDEX
    .Columns(10).Visible = False '// NOTIZ
    .Columns(11).Visible = False '//ALLOWMAIL
    .Columns(12).Visible = False '//TelFirma
    ' Autosize Column
    .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    .AutoResizeColumns()

    DBGrid.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter

    ' Adjust Header Styles
    With .ColumnHeadersDefaultCellStyle
    .BackColor = Color.Silver
    .ForeColor = Color.Black
    .Font = New Font("Tahoma", 9, FontStyle.Bold)
    End With
    End With

    '// Abschließend noch:
    DBGrid.Sort(DBGrid.Columns(1), System.ComponentModel.ListSortDirection.Ascending)
    '// DIE ERSTE ROW ist 1 !!
    DBGrid.FirstDisplayedScrollingRowIndex = 1 ' Die Grid-Anzeige zur ersten Row Scrollen
    DBGrid.CurrentCell = DBGrid.Rows(1).Cells(1) 'Nur so wird die Row zur AKTRow!
    DBGrid.Rows(1).Selected = True
    end sub

    '//
    '// DIE DATEN VON DB INS GRID LESEN (Try/END TRY hab ich noch drin, könnte weg gelassen werden)
    '//
    Private Sub RetrieveData(Optional ByVal blnSearch As Boolean = False)
    '
    strSQL = " Select * FROM [Tabelle1]"
    Try
    Cmd = New OleDbCommand
    If Conn.State = ConnectionState.Closed Then Conn.Open() '// DatenBank öffnen
    Cmd.Connection = Conn
    Cmd.CommandText = strSQL
    Dim DR As OleDbDataReader = Cmd.ExecuteReader
    Dim i As Long = DBGrid.RowCount
    While DR.Read
    With DBGrid
    .Rows.Add(i)
    .Rows(i).Cells(0).Value = DR.Item("Kindex").ToString
    .Rows(i).Cells(1).Value = DR.Item("Nachname").ToString
    .Rows(i).Cells(2).Value = DR.Item("Vorname").ToString
    .Rows(i).Cells(3).Value = DR.Item("PLZ").ToString
    .Rows(i).Cells(4).Value = DR.Item("Ort").ToString
    .Rows(i).Cells(5).Value = DR.Item("Strasse").ToString
    .Rows(i).Cells(6).Value = DR.Item("Tel1").ToString
    .Rows(i).Cells(7).Value = DR.Item("Tel2").ToString
    .Rows(i).Cells(8).Value = DR.Item("Fax").ToString
    .Rows(i).Cells(9).Value = DR.Item("Mail").ToString
    .Rows(i).Cells(10).Value = DR.Item("Notiz").ToString
    .Rows(i).Cells(11).Value = DR.Item("AllowMail").ToString
    .Rows(i).Cells(12).Value = DR.Item("TelFirma").ToString
    End With
    i += 1
    End While

    '// lblRecordCount ist nur ein Label, das die Summe anzeigt
    lblRecordCount.Text = "[Total : " & DBGrid.RowCount & " Einträge]"
    DR.Close()

    Catch ex As Exception
    MessageBox.Show(ex.Message)
    End Try
    '//
    @arr Klasse Beispiel wie man es nicht machen sollte. Zumal der TE nix aus ner DB liest, sondern anderweitig die Daten bezieht.

    P.s. Ein DataAdapter füllt eine ganze DataTable, welche man dann dem Grid als DataSource zuweist. Das ganze geht mit nur wenigen Zeilen Code.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo mrMo,
    ich machs halt gerne auch unkonventionell, wenn Ziel passt.
    Wichtig für mich war, dass der Code eben in 2 Sek die 2000 Sätze drin hat. Da ist es mir
    egal, ob das Programm 3 Kilobyte größer ist oder nicht, oder der Code "schöner aussieht"
    Es ist halt nur *eine* Möglichkeit, auf meine Anforderungen zugeschnitten.
    z.B. muss man so die Änderungen am Datensatz wegschreiben und die Grid extra updaten,
    da ich die Felder in meiner AdressMaske in Textboxen ändere...
    OK, ich denke ich hab´s jetzt!

    Ich hab das DataGridview an die DataSource gebunden..
    ..dann hab ich eine Sub erstellt mit:

    VB.NET-Quellcode

    1. ​Mp3ID3V2DATABindingSource.ResetBindings(False)
    und diese mit

    VB.NET-Quellcode

    1. ​ Invoke(Sub() _refreshDGV())
    aufgerufen..
    ..nun wird das DGV Zeilenweise befüllt und ich kann zusätzlich drinne scrollen!