Datagridview Performance

  • VB.NET
  • .NET 4.0

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    Datagridview Performance

    Moin zusammen,

    ich habe ein DGV und eine Tabelle mit ca. 60.000 Zeilen.
    Geladen wird der Inhalt aus einer entsprechenden Datatable.
    Gibt es eine Möglichkeit, das Laden zu beschleunigen?
    Es dauert ewig, bis man arbeiten kann. Mir fällt da nur Igrid ein-kann ich nicht gut mit umgehen.

    Gibt es da evtl. noch andere Microsoftspezifische Lösungen?
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ich hab ein DGv mit 2 Mio Zeilen läuft ohne Probleme.
    Das füllen der datatable aus der sql Datenbank dauert 2 Minuten aber danach ist alles super fix.

    Wie füllt du das DGv / die datatable dahinter? Evtl liegt es daran.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @razzzer530i Du kannst das Update der Anzeige während der Dauer des Ladens unterdrücken:

    VB.NET-Quellcode

    1. ctrl.SuspendLayout()
    2. ' was tun
    3. ctrl.ResumeLayout(False)
    4. ctrl.PerformLayout()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    razzzer530i schrieb:

    Gibt es eine Möglichkeit, das Laden zu beschleunigen?
    Bestimmt. Laden und Anzeigen sind unterschiedliche Vorgänge. Wie lange dauert das Laden und wie lange das Anzeigen?

    Dann wäre es interessant wie du die Daten lädst, wie diese aussehen und wie du sie anzeigst.

    Evtl. hilft auch schon das Lazy loading Pattern, aber das kann ich mit dem aktuellen Wissensstand nicht sagen.
    "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
    Sind DGV-Spalten beim Breitenmodus auf AllCells oder AllCellsExceptHeader eingestellt? Das frisst extrem Performance. Ggf. vorher abschalten und nach dem Laden wieder einschalten. Auch testweise, falls vorhanden: BindingSource.SuspendBinding, BindingSource.ResumeBinding
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @mrMo DT füllen dauert 2 ms, Sortierung 1 ms
    Die Tabelle hat derzeit 6 Spalten und rund 5.000 Einträge.

    VB.NET-Quellcode

    1. Private Sub LoadNumbers(imod As Integer)
    2. Dim sw1 As New Stopwatch
    3. Dim sw2 As New Stopwatch
    4. Dim sw3 As New Stopwatch
    5. Dim sw4 As New Stopwatch
    6. Dim dt As DataTable = Nothing
    7. Dim arrW As String() = Nothing
    8. If imod = 0 Then
    9. sw1.Start()
    10. arrId = IO.File.ReadAllLines(f_INDEX)
    11. dt = dt_Auf
    12. arrW = arrId
    13. sw1.Stop()
    14. ElseIf imod = 1 Then
    15. arrIdA = IO.File.ReadAllLines(f_INDEXA)
    16. dt = dt_Arch
    17. arrW = arrIdA
    18. End If
    19. dt.Rows.Clear()
    20. If dt IsNot Nothing AndAlso arrW IsNot Nothing Then
    21. For Each strlin In arrW
    22. Dim nr As DataRow = dt.NewRow
    23. nr.ItemArray = strlin.Split(vbTab)
    24. dt.Rows.Add(nr)
    25. Next
    26. End If
    27. If imod = 0 Then
    28. sw2.Start()
    29. dgv_pool.DataSource = dt
    30. sw2.Stop()
    31. sw3.Start()
    32. dgv_pool.Sort(dgv_pool.Columns("Angelegt"), ListSortDirection.Descending)
    33. sw3.Stop()
    34. sw4.Start()
    35. If dgv_pool.Rows.Count > 0 Then
    36. dgv_pool.FirstDisplayedScrollingRowIndex = 0
    37. End If
    38. ElseIf imod = 1 Then
    39. dgv_arch.DataSource = dt
    40. dgv_arch.Sort(dgv_arch.Columns("Angelegt"), ListSortDirection.Descending)
    41. dgv_arch.Refresh()
    42. If dgv_arch.Rows.Count > 0 Then
    43. dgv_arch.FirstDisplayedScrollingRowIndex = 0
    44. End If
    45. End If
    46. sw4.Stop()
    47. Dim strStopper As String = "DT füllen: " & sw1.ElapsedMilliseconds & " ms" & vbNewLine &
    48. "DT als Datasource für DGV setzen: " & sw2.ElapsedMilliseconds & " ms" & vbNewLine &
    49. "Sortieren: " & sw3.ElapsedMilliseconds & " ms" & vbNewLine &
    50. "Rest bis zur finalen Anzeige: " & sw4.ElapsedMilliseconds & " ms"
    51. MsgBox(strStopper)

    Ergebnis der Stopwatch:

    @VaporiZed

    Autosizing ist für die Spalten deaktiviert. Ich setzte die Spaltenbreiten manuell nach dem Laden.
    Trotzdem dauert das vollständige Anzeigen ca. 6 Sekunden.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Du lädst ja Datein aus dem Dateisysten. Das dauert an sich schonmal. Dann verarbeitest du diese Rohdaten weiter und zeigst sie dann an. Jetzt musst du schauen, welcher Schritt der Zeitfresser ist.

    Wie lange dauert IO.File.ReadAllLines bei 60.000 Zeilen und wie lange dauert der Durchlauf (Laden, Verarbeiten, Sortieren, Anzeigen) insgesamt?
    "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
    @mrMo DAs io.file.read... ist "DT Füllen", maximal 100ms bis jetzt.
    @RodFromGermany leider hilft suspentlayout nicht weiter.

    Also der Zeitfresser:

    VB.NET-Quellcode

    1. For Each strlin In arrW
    2. Dim nr As DataRow = dt.NewRow
    3. nr.ItemArray = strlin.Split(vbTab)
    4. dt.Rows.Add(nr)
    5. Next


    Dafür habe ich keine Optimierung. Beispielzeile aus arrW:
    ​"000000001" & vbTab & "05.08.2020 15:15:47" & vbTab & "05.08.2020 15:11:03" & vbTab & "111-0161222" & vbTab & vbTab & "999999"
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Dafür habe ich keine Optimierung.
    Was wäre denn das Ziel der Optimierung?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, also ich würde, da es offensichtlich nicht so leicht ist heraus zu finden wo deine Zeit verloren geht, wie folgt vorgehen:

    Nach jeder Zeile Code per Debug.Print() die aktuellen Uhrzeit ausgeben. Dann sieht man sehr gut, wo die Zeitfresser sind.
    "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
    Ich rate in solchen Fällen immer zum Prüfen der Settings im DGV. Es gibt einige Settings die bei größeren Datensätzen Schwierigkeiten machen, z.B.:

    VB.NET-Quellcode

    1. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    2. 'Oder
    3. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells


    EDIT: Schon von @VaporiZed gefragt und beantwortet. Hab ich beim ersten Mal überlesen.


    Wieso werden die Zeilen 23-27 nicht gestoppt? Und vielleicht auf nochmal die gesamte Zeit stoppen. Wäre ärgerlich, wenn die Funktion gar nicht für die Verzögerung verantwortlich ist. Außerdem brauchst du keine Stopwatch dafür. die DiagnoseTools im VS zeigen dir die Zeiten auch, wenn du BreakPoints setzt ;)



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Yanbel“ ()

    @ErfinderDesRades
    Ich glaub ja, auf einer heissen Spur zu sein (nämlich die in post#6 bereits gelegt wurde).Aber solange der TE nicht drauf eingeht, kann man da nicht weiter kommen.


    Ich bin in Post#7 darauf eingegangen.
    dt_arch und dt_auf sind zwei verschiedene Datatables die ich fülle. Diese werden dann je nach ausgewählter Ansicht in das Datagridview geladen.

    VB.NET-Quellcode

    1. dt_Auf.Columns.Add("Auftragsnummer", GetType(String))
    2. dt_Auf.Columns.Add("Angelegt", GetType(Date))
    3. dt_Auf.Columns.Add("Bearbeitet", GetType(Date))
    4. dt_Auf.Columns.Add("Bauvorhaben", GetType(String))
    5. dt_Auf.Columns.Add("Kundennummer", GetType(String))
    6. dt_Auf.Columns.Add("Matchcode", GetType(String))
    7. dgv_pool.RowHeadersVisible = False
    8. dgv_pool.DataSource = dt_Auf
    9. dgv_pool.Columns(0).Width = 100
    10. dgv_pool.Columns(1).Width = 160
    11. dgv_pool.Columns(2).Width = 160
    12. dgv_pool.Columns(3).Width = 120
    13. dgv_pool.Columns(4).Width = 100
    14. 'Archiv
    15. dt_Arch.Columns.Add("Auftragsnummer", GetType(String))
    16. dt_Arch.Columns.Add("Angelegt", GetType(Date))
    17. dt_Arch.Columns.Add("Bearbeitet", GetType(Date))
    18. dt_Arch.Columns.Add("Bauvorhaben", GetType(String))
    19. dt_Arch.Columns.Add("Kundennummer", GetType(String))
    20. dt_Arch.Columns.Add("Matchcode", GetType(String))

    Kurzer Ausschnitt. Dass sind die Datatables die ich fülle.
    Lediglich das Hinzufügen der Rows dauert so unfassbar lange. Das verstehe ich nicht so ganz, da ich die Rows ja hinzufüge, während die Tables nicht ans DGV gebunden sind.

    Hier der Zeitfresser:


    VB.NET-Quellcode

    1. swZeitfresser.Start()
    2. For Each strlin In arrW
    3. Dim nr As DataRow = dt.NewRow
    4. nr.ItemArray = strlin.Split(vbTab)
    5. dt.Rows.Add(nr)
    6. Next
    7. swZeitfresser.Stop()



    EDIT! Lösung!

    VB.NET-Quellcode

    1. sw1.Stop()
    2. dt.BeginLoadData()
    3. swZeitfresser.Start()
    4. For Each strlin In arrW
    5. Dim nr As DataRow = dt.NewRow
    6. nr.ItemArray = strlin.Split(vbTab)
    7. dt.Rows.Add(nr)
    8. Next
    9. dt.EndLoadData()
    10. swZeitfresser.Stop()


    DT.BeginloadData end EndLoadData war das Stichwort. Jetzt dauert das Ganze nurr noch 30 ms.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razzzer530i“ ()

    Also dauert der Schritt von Zeile 9 auf Zeile 10 so lange, richtig?

    EDIT: Danke für das Nachreichen des Screenshots. welche der drei Zeilen in For Each-Schleife frisst die meiste Zeit? (fragte er und kannte die Antwort bereits) Split ist keine besonders performante Methode.

    Btw: Die Formatierung des Datagrids sollte einmalig beim Öffnen der Form passieren und nicht jedes mal wenn du die Datasource neu zuweist.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Yanbel“ ()

    Yanbel schrieb:

    Also dauert der Schritt von Zeile 9 auf Zeile 10 so lange, richtig?

    EDIT: Danke für das Nachreichen des Screenshots. welche der drei Zeilen in For Each-Schleife frisst die meiste Zeit? (fragte er und kannte die Antwort bereits) Split ist keine besonders performante Methode.

    Btw: Die Formatierung des Datagrids sollte einmalig beim Öffnen der Form passieren und nicht jedes mal wenn du die Datasource neu zuweist.


    Genau, die Zeile mit der Split Methode frisst...Welche Methode ist da Flotter

    Formatiert werden die Datatables nur einmalig in einer Init Sub. Danach werden Sie nur neu geladen, da sich der Inhalt alle X Sekunden ändern kann. Daher: Wenn jemand die Ansicht wechselt, werden die Daten neu eingelesen. Im Hintergrund läuft ein Server Modul, dass Indizierungsroutinen ausführt. Wenn sich somit Basefiles ändern, muss die Anischt auch für den Client geändert werden.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Leider gibt es kaum eine schnellere Methode als Split. Aber die Stapelverarbeitung kannst du anpassen. Ich habe gerade eine Methode getestet Mit 6500 Zeilen à 26 Werten. War in 37ms fertig.

    Klasse

    VB.NET-Quellcode

    1. Public Class TestData
    2. Public Property TestString1 As String
    3. Public Property TestString2 As String
    4. Public Property TestString3 As String
    5. Public Property TestString4 As String
    6. Public Property TestString5 As String
    7. Public Property TestString6 As String
    8. Public Property TestString7 As String
    9. Public Property TestString8 As String
    10. Public Property TestString9 As String
    11. Public Property TestString10 As String
    12. Public Property TestString11 As String
    13. Public Property TestString12 As String
    14. Public Property TestString13 As String
    15. Public Property TestString14 As String
    16. Public Property TestString15 As String
    17. Public Property TestString16 As String
    18. Public Property TestString17 As String
    19. Public Property TestString18 As String
    20. Public Property TestString19 As String
    21. Public Property TestString20 As String
    22. Public Property TestString21 As String
    23. Public Property TestString22 As String
    24. Public Property TestString23 As String
    25. Public Property TestString24 As String
    26. Public Property TestString25 As String
    27. Public Property TestString26 As String
    28. End Class


    Methode

    VB.NET-Quellcode

    1. Dim AllData As New List(Of TestData)
    2. Dim AllLines As List(Of String)
    3. Dim Trennzeichen1 As Char = CChar(Microsoft.VisualBasic.vbCrLf)
    4. Dim Trennzeichen2 As Char = CChar(";")
    5. Using sr As New StreamReader(_InputDXFFile)
    6. AllLines = sr.ReadToEnd.Split(Trennzeichen1).ToList
    7. For Each Line In AllLines
    8. Dim StringList As List(Of String) = Line.Split(Trennzeichen2).ToList
    9. Dim Data As New TestData With {.TestString1 = StringList(0),
    10. .TestString2 = StringList(1),
    11. .TestString3 = StringList(2),
    12. .TestString4 = StringList(3),
    13. .TestString5 = StringList(4),
    14. .TestString6 = StringList(5),
    15. .TestString7 = StringList(6),
    16. .TestString8 = StringList(7),
    17. .TestString9 = StringList(8),
    18. .TestString10 = StringList(9),
    19. .TestString11 = StringList(10),
    20. .TestString12 = StringList(11),
    21. .TestString13 = StringList(12),
    22. .TestString14 = StringList(13),
    23. .TestString15 = StringList(14),
    24. .TestString16 = StringList(15),
    25. .TestString17 = StringList(16),
    26. .TestString18 = StringList(17),
    27. .TestString19 = StringList(18),
    28. .TestString20 = StringList(19),
    29. .TestString21 = StringList(20),
    30. .TestString22 = StringList(21),
    31. .TestString23 = StringList(22),
    32. .TestString24 = StringList(23),
    33. .TestString25 = StringList(24),
    34. .TestString26 = StringList(25)}
    35. AllData.Add(Data)
    36. Next
    37. sr.Close()
    38. End Using


    Das Ergebnis lädst du dann direkt ins DGV. Spar dir die Datatable. Musst das DGV im Init nur entsprechend konfigurieren:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. dgvTestData.Columns.Clear()
    2. dgvTestData.DataSource = Nothing
    3. dgvTestData.AutoGenerateColumns = False
    4. dgvTestData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
    5. dgvTestData.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllHeaders
    6. dgvTestData.AllowUserToResizeColumns = True
    7. dgvTestData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
    8. dgvTestData.AllowUserToAddRows = False
    9. dgvTestData.AllowUserToDeleteRows = True
    10. dgvTestData.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    11. dgvTestData.MultiSelect = False
    12. dgvTestData.ScrollBars = ScrollBars.Both
    13. Dim DateCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "dd.MM.yyyy"}
    14. Dim DateTimeCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "dd.MM.yyyy HH:mm:ss"}
    15. Dim TextCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft}
    16. Dim IntCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "#0"}
    17. Dim DecimalCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "#0.00"}
    18. Dim MoneyCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "##,##0.00 EUR"}
    19. Dim PercentCellStyle As New DataGridViewCellStyle With {.Alignment = DataGridViewContentAlignment.MiddleLeft, .Format = "0.00 %"}
    20. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString1", .DataPropertyName = "TestString1", .HeaderText = "Vorname", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    21. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString2", .DataPropertyName = "TestString2", .HeaderText = "Nachname", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    22. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString3", .DataPropertyName = "TestString3", .HeaderText = "Geburtstag", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = DateCellStyle})
    23. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString4", .DataPropertyName = "TestString4", .HeaderText = "Geburtsort", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    24. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString5", .DataPropertyName = "TestString5", .HeaderText = "Straße", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    25. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString6", .DataPropertyName = "TestString6", .HeaderText = "Hausnummer", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    26. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString7", .DataPropertyName = "TestString7", .HeaderText = "PLZ", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = TextCellStyle})
    27. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString8", .DataPropertyName = "TestString8", .HeaderText = "Ort", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    28. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString9", .DataPropertyName = "TestString9", .HeaderText = "Telefon", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    29. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString10", .DataPropertyName = "TestString10", .HeaderText = "Mobil", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    30. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString11", .DataPropertyName = "TestString11", .HeaderText = "Email", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = TextCellStyle})
    31. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString12", .DataPropertyName = "TestString12", .HeaderText = "Notfallkontakt", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    32. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString13", .DataPropertyName = "TestString13", .HeaderText = "Bemerkung", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    33. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString14", .DataPropertyName = "TestString14", .HeaderText = "Abteilung", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    34. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString15", .DataPropertyName = "TestString15", .HeaderText = "Standort", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = TextCellStyle})
    35. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString16", .DataPropertyName = "TestString16", .HeaderText = "Sozialversicherungsnummer", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    36. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString17", .DataPropertyName = "TestString17", .HeaderText = "Arbeitszeit / Woche", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = IntCellStyle})
    37. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString18", .DataPropertyName = "TestString18", .HeaderText = "Monatsgehalt", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = MoneyCellStyle})
    38. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString19", .DataPropertyName = "TestString19", .HeaderText = "Urlaubsgeld", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = MoneyCellStyle})
    39. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString20", .DataPropertyName = "TestString20", .HeaderText = "Weinachtsgeld", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = MoneyCellStyle})
    40. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString21", .DataPropertyName = "TestString21", .HeaderText = "Provision", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = PercentCellStyle})
    41. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString22", .DataPropertyName = "TestString22", .HeaderText = "Notiz1", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    42. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString23", .DataPropertyName = "TestString23", .HeaderText = "Notiz2", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(Date), .DefaultCellStyle = TextCellStyle})
    43. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString24", .DataPropertyName = "TestString24", .HeaderText = "Notiz3", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    44. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString25", .DataPropertyName = "TestString25", .HeaderText = "Vorgesetzter", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})
    45. dgvTestData.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "TestString26", .DataPropertyName = "TestString26", .HeaderText = "Vertretung", .[ReadOnly] = True, .Visible = True, .ValueType = GetType(String), .DefaultCellStyle = TextCellStyle})



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Yanbel“ ()

    schau mal nach der Einstellung im Datagridview

    VB.NET-Quellcode

    1. DataGridViewColumnHeadersHeightSizeMode

    dieser wert dort ist bei Default = AutoSize

    setzte den Wert auf= DisableResizing

    EDIT:
    hier ein Test zum Laden einer Textdatei mit 50000 zeilen und 6 spalten
    dauer ca 300ms
    ich dachte mit vbTab als trenner würde das Laden länger dauern aber mit semicolon ist es
    fast gleich

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form5
    3. Private dt As DataTable = New DataTable()
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. 'Textdatei mit 50000 zeilen und 6 spalten
    6. Dim sFileName As String = "E:\TestFolder\myTest3.txt"
    7. Dim myData As DataTable = ToDataTable(sFileName)
    8. DataGridView1.DataSource = myData
    9. End Sub
    10. Public Function ToDataTable(ByVal txtfile As String) As DataTable
    11. Dim sw1 As New Stopwatch
    12. sw1.Start()
    13. Dim lines() As String = File.ReadAllLines(txtfile)
    14. dt.Columns.Add(New DataColumn With {.ColumnName = "Nr", _
    15. .DataType = GetType(Integer)})
    16. dt.Columns.Add(New DataColumn With {.ColumnName = "Col2", _
    17. .DataType = GetType(Integer)})
    18. dt.Columns.Add(New DataColumn With {.ColumnName = "Datum", _
    19. .DataType = GetType(Date)})
    20. dt.Columns.Add(New DataColumn With {.ColumnName = "Col4", _
    21. .DataType = GetType(Integer)})
    22. dt.Columns.Add(New DataColumn With {.ColumnName = "Col5", _
    23. .DataType = GetType(Integer)})
    24. dt.Columns.Add(New DataColumn With {.ColumnName = "Col6", _
    25. .DataType = GetType(Integer)})
    26. 'first row has Headers, so skip 1 line
    27. dt = lines.Skip(1).Select(Function(x) dt.LoadDataRow(x.Split(New String() {vbTab}, _
    28. StringSplitOptions.RemoveEmptyEntries), False)) _
    29. .ToArray() _
    30. .CopyToDataTable()
    31. sw1.Stop()
    32. Dim strStopper As String = "DT füllen: " & sw1.ElapsedMilliseconds & " ms"
    33. MessageBox.Show(strStopper)
    34. 'Zeit : 303 ms
    35. Return dt
    36. End Function
    37. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kasi“ ()