Recht häufig stoße ich auf Posts, wo Dateinamen in Listboxen gestopft werden, und will man die Datei dann kopieren, dann steht der Dateipfad nicht zur Verfügung und vergleichbares Zeug.
Listbox ist nicht dazu da, dumme Strings aufzunehmen, sie kann ganze FileInfos aufnehmen, und der DateiPfad ("Fullname") ist nur eine der mannigfachen Datei-Information, die FileInfo bereitstellt.
Also: Vergesst Directory.GetFiles(), und nehmt stattdessen DirectoryInfo.GetFiles() !!
Und vergesst auch den My.Computer.FileSystem - Namespace, denn auch sowas:
liefert keine FileInfos, sondern nur dumme Strings.
Und trennt Daten von Controls.
Also füllt nicht die .GetFiles() direkt in die Listbox, sondern füllt eine List(Of FileInfo) damit ab, und bindet die Listbox daran.
Listbox hat die erfreuliche Property .DisplayMember, mit der man angeben kann, welche der 15 Properties eines FileInfos angezeigt werden soll.
Hier habe ich eine App gebastelt, mit der man den DisplayMember sogar umschalten kann.
Das Umschalten erfolgt über eine Combobox cmbDisplayMember, die an ein String-Array gebunden ist, welche schomal 7 der 15 FileInfo-Properties bezeichnen.
Damit ist hoffentlich bewiesen, dass eine mit FileInfos befüllte Listbox wesentlich mächtiger ist, als wenn man nur dumme Strings einfüllt.
Im cmbDisplayMember_SelectedIndexChanged() wird der selektierte DisplayMember nicht aus der Combo geholt, sondern aus dem zugrundeliegenden String-Array.
Denn letzteres ist typisiert, während ich bei Zugriff per cmbDisplayMember.SelectedItem hätte eine Typumwandlung durchführen müssen.
Das gleiche Prinzip bei btShowCreationTime_Click(): das aktuell angewählte FileInfo wird nicht aus der Listbox gepuhlt, sondern dem FileInfo-Array entnommen - ebenfalls ohne Typumwandlung.
Mit diesem FileInfo könnte ich jetzt alles mögliche machen: kopieren, löschen, verschieben - aber im Sample zeige ich nur die .CreationTime an.
Also: Beim Proggen immer schön sauber bleiben! ;)
Listbox ist nicht dazu da, dumme Strings aufzunehmen, sie kann ganze FileInfos aufnehmen, und der DateiPfad ("Fullname") ist nur eine der mannigfachen Datei-Information, die FileInfo bereitstellt.
Also: Vergesst Directory.GetFiles(), und nehmt stattdessen DirectoryInfo.GetFiles() !!
Und vergesst auch den My.Computer.FileSystem - Namespace, denn auch sowas:
Und trennt Daten von Controls.
Also füllt nicht die .GetFiles() direkt in die Listbox, sondern füllt eine List(Of FileInfo) damit ab, und bindet die Listbox daran.
Listbox hat die erfreuliche Property .DisplayMember, mit der man angeben kann, welche der 15 Properties eines FileInfos angezeigt werden soll.
Hier habe ich eine App gebastelt, mit der man den DisplayMember sogar umschalten kann.
Das Umschalten erfolgt über eine Combobox cmbDisplayMember, die an ein String-Array gebunden ist, welche schomal 7 der 15 FileInfo-Properties bezeichnen.
Damit ist hoffentlich bewiesen, dass eine mit FileInfos befüllte Listbox wesentlich mächtiger ist, als wenn man nur dumme Strings einfüllt.
Im cmbDisplayMember_SelectedIndexChanged() wird der selektierte DisplayMember nicht aus der Combo geholt, sondern aus dem zugrundeliegenden String-Array.
Denn letzteres ist typisiert, während ich bei Zugriff per cmbDisplayMember.SelectedItem hätte eine Typumwandlung durchführen müssen.
Das gleiche Prinzip bei btShowCreationTime_Click(): das aktuell angewählte FileInfo wird nicht aus der Listbox gepuhlt, sondern dem FileInfo-Array entnommen - ebenfalls ohne Typumwandlung.
Mit diesem FileInfo könnte ich jetzt alles mögliche machen: kopieren, löschen, verschieben - aber im Sample zeige ich nur die .CreationTime an.
Also: Beim Proggen immer schön sauber bleiben! ;)
VB.NET-Quellcode
- Imports System.IO
- Public Class frmFileInfoToListbox
- Private _Files As FileInfo()
- Private _DisplayMembers As String() = "Name Fullname Extension Length Exists Attributes CreationTime".Split
- Private Sub frmFileInfoToListbox_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
- cmbDisplayMember.DataSource = _DisplayMembers
- dlgFolder.SelectedPath = Path.GetFullPath("..\..\")
- Reload()
- End Sub
- Private Sub cmbDisplayMember_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbDisplayMember.SelectedIndexChanged
- lstFiles.DisplayMember = _DisplayMembers(cmbDisplayMember.SelectedIndex)
- End Sub
- Private Sub btFolder_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btFolder.Click
- If dlgFolder.ShowDialog = Windows.Forms.DialogResult.OK Then Reload()
- End Sub
- Private Sub btShowCreationTime_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btShowCreationTime.Click
- MessageBox.Show(_Files(lstFiles.SelectedIndex).CreationTime.ToString)
- End Sub
- Private Sub Reload()
- Dim di = New DirectoryInfo(dlgFolder.SelectedPath)
- _Files = di.GetFiles("*.*", SearchOption.AllDirectories)
- lstFiles.DataSource = _Files
- End Sub
- End Class
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()