| |
VB.NET - Ein- und UmsteigerDatagridview 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 | |
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? | |
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 | |
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 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Oktober 2024 Heinz PrelleFirewall-Status unter WinXP/Vista prüfenDas Beispiel prüft, ob die Firewall unter Windows XP/Vista eingeschaltet ist oder nicht. Zudem wird eine Abfrage durchgeführt ob es sich bei dem zugrundeliegenden Betriebssystem um Windows XP/Vista handelt oder nicht. Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|