vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 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 aktualisieren 
Autor: Theo_kkv
Datum: 13.09.24 23:02

Hallo,
ich lasse in einem Datagridview Parameter von Dateien (Dateigrösse, letzter Zugriff, erstellt am usw.) darstellen. Das Datatable wird hier erstellt
Public Shared Function bu_tm_columns(ByVal tm_table As DataTable) As DataTable
 
    With tm_table
            .TableName = "Backup_Tabelle"
            .Columns.Add(New DataColumn("erstellt am", Type.GetType( _
              "System.DateTime")))
            .Columns.Add(New DataColumn("Größe (kByte)", Type.GetType( _
            "System.String")))
            .Columns.Add(New DataColumn("letzter Zugriff", Type.GetType( _
            "System.DateTime")))
            .Columns.Add(New DataColumn("letzte Änderung", Type.GetType( _
            "System.DateTime")))
            .Columns.Add(New DataColumn("Dateiname", Type.GetType( _
            "System.String")))
    End With
 
    Return tm_table
End Function
Die Dateiinformationen kommen mit LINQ hier
Public Shared Function bu_linq(ByVal tm_dir As DirectoryInfo) As IEnumerable(Of _
  Class_TM)
    Return From file In tm_dir.GetFiles("*._bak") Select New Class_TM With
                                                 {.bu_create = _
                                                   file.CreationTime,
                                                  .bu_groesse = file.Length,
                                                  .bu_lastaccess = _
                                                    file.LastAccessTime,
                                                  .bu_lastmodified = _
                                                  file.LastWriteTime,
                                                  .bu_filename = file.FullName}
 
End Function
Hier kommen die Werte aus LINQ in eine Datatable
Public Shared Function bu_tm_rows(ByVal bu_files As IEnumerable(Of Class_TM), _
  ByVal tm_table As DataTable, ByVal tm_settings As Class_Settings) As DataTable
 
    For Each zeile As Class_TM In bu_files
        Dim dr As DataRow = tm_table.NewRow
        dr("erstellt am") = zeile.bu_create.ToShortDateString
        dr("Größe (kByte)") = Math.Round(zeile.bu_groesse / 1024, 2).ToString
        dr("letzter Zugriff") = zeile.bu_lastaccess.ToLongTimeString
        dr("letzte Änderung") = zeile.bu_lastmodified.ToLongTimeString
        dr("Dateiname") = zeile.bu_filename
 
        tm_table.Rows.Add(dr)
    Next
    Return tm_table
End Function
Schlussendlich wird das Datatable als Datasource an das Datagridview gebunden
Private Sub daten_in_dgv()
    With DataGridView1
        .DataSource = tm_table
        .Columns("Dateiname").Visible = False
    End With
End Sub
Das zum Vorspiel.
Nun lösche ich eine Datei und lasse über einen Filesystemwatcher das Ereignis überwachen. Danach lasse ich die bereits vorhandenen Zeilen löschen
tm_table.Rows.Clear()
und hoffte, mit "bu_linq" und "bu_tm_rows" die Daten neu lesen, in die Zeilen des Datatable zu bringen und erneut an das Datagridview zu binden.
Leider klappt das nicht. Es liegt sicher an der Datenbindung. Es erscheint eine
"System.Indexoutofrangeexception: Der Index 2 hat keinen Wert. bei System.Windows.Forms.CurrencyManager.get_items(Int32index)
bei System.Windows.Forms.DatagridviewDataConnection.GetError(int32 rowindex)

Hat jemand einen Vorschlag, wie ich die Aktualisierung des Datagridview erreichen kann?

Vielen Dank für Eure Hilfe.

Grüße Tom
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview aktualisieren 
Autor: Manfred X
Datum: 15.09.24 06:19

Hallo!

Du lieferst eine nette Auswahl aus Deinem Code.

Es wird nichts über Class_TM mitgeteilt. Warum wird nicht die Fileinfo-Klasse direkt genutzt
um die Datatable zu füllen? Wo bu_files auf die Linq-Abfrage zugewiesen wird, kann ich nicht erkennen.

Ob Du vor dem Löschen und Neubefüllen der Datatable die Datenbindung unterbrichst und danach wieder
herstellst, ist nicht zu erkennen. Warum nutzt Du keine Bindingsource? Diese Klasse verfügt über
geeignete Methoden.

Wieso reagierst Du nicht auf die Informationen des Filesystemwatchers und löscht bzw. aktualisierst
nur die Angaben zu geänderten/gelöschten/erstellten Dateien in der Table, statt die Table komplett
neu aufzubauen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview aktualisieren 
Autor: Theo_kkv
Datum: 15.09.24 14:17

Hallo Manfred X,
vielen Dank für Deine Antwort und die Hinweise. Du hast Recht, einige Dinge habe ich nicht erwähnt.
Es gibt diese kleine Methode.
Private Sub tm_loader()
    dir = New DirectoryInfo(tm_setting.pfad_sicherungsdatei)
    tm_table = New DataTable
    tm_table = Class_TM.bu_tm_columns(tm_table)
    Dim linq_data As IEnumerable(Of Class_TM) = Class_TM.bu_linq(dir)
    tm_table = Class_TM.bu_tm_rows(linq_data, tm_table, tm_setting)
   ' Dim bu_files As IEnumerable(Of FileInfo) = From files In dir.GetFiles( 
   ' "*.bak") spielt hier keine Rolle
    DataGridView1.DataSource = tm_table
End Sub
Ob Du vor dem Löschen und Neubefüllen der Datatable die Datenbindung unterbrichst und danach wieder
herstellst, ist nicht zu erkennen. Warum nutzt Du keine Bindingsource? Diese Klasse verfügt über
geeignete Methoden.

Das wäre wahrscheinlich ein lohnender Ansatz, die Databinding aufzuheben und danach wieder neu anzusetzen.

Wieso reagierst Du nicht auf die Informationen des Filesystemwatchers und löscht bzw. aktualisierst
nur die Angaben zu geänderten/gelöschten/erstellten Dateien in der Table, statt die Table komplett
neu aufzubauen?

Ich habe bislang keine Antwort auf die Frage zum Zusammenhang zwischen der gelöschten Datei und dem Eintrag im Datagridview. Daher erschien es mir einfacher, die ganze Tabelle neu aufzubauen und im Datagridview zu präsentieren.
Private Sub FSW1_Deleted(sender As Object, e As IO.FileSystemEventArgs) Handles _
  FSW1.Deleted
        tm_table.Rows.Clear()
       ' tm_table = Class_TM.bu_tm_columns(tm_table) die Spalten sind schon 
       ' vorhanden
        Dim linq_data As IEnumerable(Of Class_TM) = Class_TM.bu_linq(dir)
        tm_table = Class_TM.bu_tm_rows(linq_data, tm_table, tm_setting) ' nur 
        ' die Zeilen sollten neu hinzu gefügt werden
End Sub
Viele Grüße
Tom
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview aktualisieren 
Autor: Manfred X
Datum: 15.09.24 19:40

Hallo!

Kleines Beispiel-Formular
Public Class frmFilesystemViewer
 
    Dim WithEvents fsw As New IO.FileSystemWatcher
    Dim fbd As New FolderBrowserDialog With {.ShowNewFolderButton = False}
 
    Dim dt As New DataTable
    Dim bs As New BindingSource
    Dim dgv As New DataGridView With
        {.Parent = Me, .Top = 50, .Left = 10, .Width = 300, .Height = 400, _
          .DataSource = bs}
 
    Dim WithEvents btnFolderToWatch As New Button With
    {.Parent = Me, .Top = 5, .Left = 5, .Width = 300, .Text = "Folder To Watch" & _
      "Files"}
 
 
    Private Sub frmFilesystemViewer_Load(sender As Object, e As EventArgs) _
      Handles MyBase.Load
        With dt.Columns
            .Add("Name", GetType(String))
            .Add("Size", GetType(Integer))
            .Add("Creation", GetType(Date))
        End With
        dt.PrimaryKey = {dt.Columns("Name")}
        bs.DataSource = dt
    End Sub
 
 
    Private Sub btnFolderToWatch_Click(sender As Object, e As EventArgs) _
      Handles btnFolderToWatch.Click
 
        If fbd.ShowDialog = DialogResult.Cancel Then Exit Sub
 
        FillTable(fbd.SelectedPath)
 
        With fsw
            .Filter = "*.*"
            .NotifyFilter = IO.NotifyFilters.FileName Or _
              IO.NotifyFilters.LastWrite
            .Path = fbd.SelectedPath
            .EnableRaisingEvents = True
        End With
 
    End Sub
 
 
    Private Function FillTable(ByVal folder As String) As Integer
 
        bs.SuspendBinding()
 
        With dt.Rows
            .Clear()
            Dim di As New IO.DirectoryInfo(folder)
            For Each fi As IO.FileInfo In di.GetFiles("*.*")
                Dim row As DataRow = dt.NewRow
                row("Name") = fi.Name : row("Size") = fi.Length 
                row("Creation") = fi.CreationTime
                .Add(row)
            Next fi
            Return .Count
        End With
 
        bs.ResumeBinding()
        bs.ResetBindings(False)
 
    End Function
 
    Private Function Reset()
        bs.ResetBindings(False)
    End Function
 
 
    Private Sub fsw_Renamed(sender As Object, e As IO.RenamedEventArgs) Handles _
      fsw.Renamed
        Dim row As DataRow = dt.Rows.Find(e.OldName)
        row("Name") = e.Name
        Invoke(New MethodInvoker(AddressOf Reset))
    End Sub
 
 
    Private Sub fsw_Deleted(sender As Object, e As IO.FileSystemEventArgs) _
      Handles fsw.Deleted
        Dim row As DataRow = dt.Rows.Find(e.Name)
        dt.Rows.Remove(row)
        Invoke(New MethodInvoker(AddressOf Reset))
    End Sub
 
 
    Private Sub fsw_Created(sender As Object, e As IO.FileSystemEventArgs) _
      Handles fsw.Created
        Dim fi As New IO.FileInfo(e.FullPath)
        Dim row As DataRow = dt.NewRow
        row.ItemArray = {fi.Name, fi.Length, fi.CreationTime}
        dt.Rows.Add(row)
        Invoke(New MethodInvoker(AddressOf Reset))
    End Sub
 
 
    Private Sub fsw_Changed(sender As Object, e As IO.FileSystemEventArgs) _
      Handles fsw.Changed
        If e.ChangeType = IO.WatcherChangeTypes.Changed Then
            Dim row As DataRow = dt.Rows.Find(e.Name)
            Dim fi As New IO.FileInfo(e.FullPath)
            row.ItemArray = {fi.Name, fi.Length, fi.CreationTime}
        End If
        Invoke(New MethodInvoker(AddressOf Reset))
    End Sub
End Class
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