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 |