Von VBA zu C#: Dateidialoge

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Unter VBA musste man schon einigen Zusatzcode inklusive Api-Deklarationen zu seinem Projekt hinzufügen, um Dialoge etwa zum Auswählen einer zu öffnenden Datei, eines Verzeichnisses oder zur Angabe eines Dateinamens zum Speichern anzuzeigen. Unter .NET gibt es dazu natürlich eine vorgefertigte Klasse, die alle notwendigen Funktionen liefert. Der vorliegende Artikel zeigt, wie Sie diese Dialoge anzeigen und die damit ermittelten Daten nutzen können.

Die folgenden Beispiele verwenden eine WPF-Anwendung unter C#.

Dateien auswählen per Klasse

Unter VBA gibt es verschiedene Varianten, um beispielsweise einen Datei öffnen-Dialog anzuzeigen. Per API, über die versteckte Wizhook-Klasse oder auch mit der entsprechenden Klasse der Office-Bibliothek. Alle Lösungen hatten Vor- und Nachteile, aber wirklich perfekt war keine davon.

Unter .NET und in unserem Fall unter C# gibt es eine Klasse namens OpenFileDialog. Diese ist Bestandteil des Namespaces Microsoft.Win32, den Sie der Klasse per using-Anweisung bekannt machen:

using Microsoft.Win32;

Danach können Sie bereits auf die OpenFileDialog-Klasse zugreifen. Dazu legen wir ein WPF-Formular an, das wie in Bild 1 aussieht. Das Textfeld heißt txtDateiname, die Schaltfläche btnDateiAuswaehlen. Für die Schaltfläche hinterlegen wir die folgende Ereignisprozedur:

Entwurf des Fensters zum Auswählen einer Datei

Bild 1: Entwurf des Fensters zum Auswählen einer Datei

private void btnDateiAuswaehlen_Click(object sender, 
         RoutedEventArgs e) {
     OpenFileDialog openFileDialog = new OpenFileDialog();
     if (openFileDialog.ShowDialog()== true) {
         txtDateiname.Text = openFileDialog.FileName;
     }
}

Diese erstellt zunächst ein neues Objekt auf Basis der Klasse OpenFileDialog. Im folgenden Schritt rufen wir den Datei öffnen-Dialog mit der Funktion ShowDialog auf. Diese zeigt den Datei öffnen-Dialog an und erwartet die Eingabe des Benutzers (siehe Bild 2). Die Funktion liefert als Ergebnis einen Boolean-Wert zurück, den die if-Anweisung auswertet. Lautet das Ergebnis true, hat der Benutzer eine Datei ausgewählt und wir können diese über die Eigenschaft FileName des OpenFileDialog-Objekts auslesen und als Text des Textfeldes txtDateiname eintragen.

Ein einfacher Datei öffnen-Dialog

Bild 2: Ein einfacher Datei öffnen-Dialog

Den Wert false liefert die Funktion nur dann zurück, wenn der Benutzer den Dialog mit der Schließen-Schaltfläche oben rechts oder mit der Abbrechen-Schaltfläche unten rechts beendet.

Eigenschaften des OpenFileDialog-Objekts

Die Klasse besitzt natürlich einige Eigenschaften, mit denen Sie das Aussehen des Dialogs und auch seine Funktion beeinflussen können. Hier ist eine Liste der wichtigsten Eigenschaften samt Kurzbeschreibung – weiter unten schauen wir uns Beispiele zu den wichtigsten Eigenschaften an:

  • CheckFileExists: Boolean-Wert, der angibt, ob das Vorhandensein der gewählten Datei geprüft werden soll. Der Wert false lässt auch die Angabe nicht vorhandener Dateien zu, der Wert true liefert eine Meldung, wenn eine nicht vorhandene Datei gewählt wird (Standardwert: true)
  • CustomPlaces: Spezielle Ordner zusätzlich zu den Favoriten-Ordnern anzeigen
  • DereferenceLinks: Legt fest, ob bei der Auswahl einer Dateiverknüpfung die Verknüpfung selbst zurückgegeben werden soll (in der Regel eine .lnk-Datei) oder der Pfad zu der verknüpften Datei.
  • FileName: Liefert den Dateinamen der gewählten Datei zurück.
  • FileNames: Liefert ein Array mit den Dateinamen der gewählten Dateien zurück. Sowohl FileName als auch FileNames funktionieren bei der Einfachauswahl als auch bei der Mehrfachauswahl (siehe Eigenschaft MultiSelect).
  • FileOk: Dies ist ein Ereignis, das ausgelöst wird, wenn der Benutzer die Schaltfläche Öffnen des Datei öffnen-Dialogs betätigt hat.
  • Filter: Erwartet einen Ausdruck, der die zu filternden Dateien angibt. Beispiel: Access-Datenbanken (*.mdb, *.accdb)|*.mdb;*.accdb|Alle Dateien (*.*)|*.*
  • FilterIndex: Legt fest, welcher Filter-Eintrag angezeigt werden soll (1 für den ersten Eintrag, 2 für den zweiten und so weiter)
  • InitialDirectory: Gibt das beim Einblenden des Dialogs anzuzeigende Verzeichnis an, entweder als Zeichenkette mit führendem @-Zeichen (@”c:\”) oder als Ausdruck, zum Beispiel AppDomain.CurrentDomain.BaseDirectory für das Verzeichnis der aktuellen Anwendung.
  • MultiSelect: Boolean-Eigenschaft, die festlegt, ob nur eine (false) oder mehrere Dateien gleichzeitig ausgewählt werden können (true).
  • SafeFileName: Liefert den Dateinamen ohne Verzeichnis.
  • SafeFileNames: Liefert bei Mehrfachauswahl die Dateinahmen ohne Verzeichnis.
  • ShowDialog: Zeigt den Dialog an und liefert den Wert true zurück, wenn der Benutzer den Dialog mit der Öffnen-Schaltfläche schließt.
  • Title: Legt den Fenstertitel fest.

Mehrere Dateien ermitteln

Wenn Sie mit der OpenFileDialog-Klasse nicht nur eine, sondern gegebenenfalls auch einmal mehrere Dateien gleichzeitig ermitteln möchten, bedarf es nur weniger Änderungen (siehe Listing 1). Dazu stellen Sie zunächst einmal den Wert der Eigenschaft MultiSelect der Objektvariablen openFileDialog auf den Wert true ein. Danach zeigen Sie den Dialog wie gewohnt mit der Methode ShowDialog an.

private void btnDateienAuswaehlen_Click(object sender, RoutedEventArgs e) {
     OpenFileDialog openFileDialog = new OpenFileDialog();
     openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
     openFileDialog.Multiselect = true;
     if (openFileDialog.ShowDialog() == true) {
         foreach(string filename in openFileDialog.FileNames) {
             lstDateinamen.Items.Add(filename);
         }
         txtDateiname.Text = openFileDialog.FileName;
     }
}

Listing 1: Einlesen mehrerer Dateinamen per OpenFileDialog

Hat der Benutzer die gewünschten Dateien ausgewählt und die Öffnen-Schaltfläche betätigt (siehe Bild 3), gehen wir allerdings etwas anders vor als bei einer einzigen Datei. In diesem Fall soll die Methode nämlich eine foreach-Schleife über alle string-Objekte der Auflistung FileNames des OpenFileDialog-Objekts durchlaufen. Innerhalb der Schleife fügt die Methode der Auflistung Items des Listenfeldes namens lstDateinamen einen neuen Eintrag mit der Add-Methode hinzu.

Markieren mehrerer Dateien gleichzeitig

Bild 3: Markieren mehrerer Dateien gleichzeitig

Das Ergebnis sieht wie in Bild 4 aus. Der Methode haben wir noch eine weitere Anweisung hinzugefügt, welche den Wert der Eigenschaft FileName in das Textfeld txtDateiname einträgt. Damit zeigen wir, dass auch bei der Einstellung MultiSelect = true der erste Eintrag über die FileName-Eigenschaft ermittelt werden kann.

Anzeige der Dateien im Listenfeld

Bild 4: Anzeige der Dateien im Listenfeld

Textdatei einlesen

Wenn wir schon Dateien auswählen, können wir deren Inhalt auch direkt einmal in ein Textfeld einlesen – zumindest, wenn es sich um eine Textdatei handelt.

Dazu verwenden wir die Schaltfläche btnDateiEinlesen, welche die Methode aus Listing 2 auslöst. Wir wollen an dieser Stelle gleich ein Beispiel für einen Filter liefern. Der Öffnen-Dialog soll entweder nur Dateien mit der Dateiendung .txt, mit der Endung .xml oder alle Dateien anzeigen (*.*) – siehe Bild 5. Dazu geben wir der Eigenschaft Filter einen entsprechenden Ausdruck mit und stellen den zu Beginn anzuzeigenden Filtereintrag mit der Eigenschaft FilterIndex ein.

Einlesen von Text- oder XML-Dateien per Filter

Bild 5: Einlesen von Text- oder XML-Dateien per Filter

Nach dem Anzeigen des Öffnen-Dialogs und der Auswahl der Datei speichert die Methode den Dateinamen in der Variablen dateiname. Dann erstellt sie ein neues Objekt des Typs StreamReader und übergibt dem Konstruktor den Dateinamen. Die Methode ReadToEnd ermittelt schließlich den Inhalt der Textdatei und trägt diesen in das Textfeld txtDateiinhalt ein. Der Dateiname landet schließlich noch im Textfeld txtDateiname. Das Ergebnis sieht dann wie in Bild 6 aus.

Das Beispielformular nach dem Einlesen einer XML-Datei

Bild 6: Das Beispielformular nach dem Einlesen einer XML-Datei

Ereignis nach Auswahl auslösen

Die Klasse OpenFileDialog bietet auch ein Ereignis an, das Sie implementieren können. Dazu legen wir eine neue Schaltfläche namens btnEreignisFileOk an. Die dadurch ausgelöste Methode finden Sie in Listing 3. Diese zeigt wieder ein OpenFileDialog-Fenster an. Diesmal fügt sie jedoch der Eigenschaft FileOk den Namen der auszulösenden Methode hinzu, nämlich OpenFileDialog1_FileOk. Dazu verwenden wir den +=-Operator. Nach der Eingabe dieses Operators bietet Visual Studio an, per Tabulator-Taste automatisch den Wert OpenFileDialog1_FileOk hinzuzufügen und die entsprechende Ereignis-Methode anzulegen, was wir dankend annehmen. Damit wir diese für das Objekt OpenFileDialog1 implementieren können, müssen wir die entsprechende Objektvariable diesmal außerhalb der Methode deklarieren, welche die Ereigniseigenschaft füllt:

private void btnEreignisFileOK_Click(object sender, RoutedEventArgs e) {
     openFileDialog1 = new OpenFileDialog();
     openFileDialog1.FileOk += OpenFileDialog1_FileOk;
     if (openFileDialog1.ShowDialog() == true) {
         txtDateiname.Text = openFileDialog1.FileName;
     }
}

Listing 3: Anzeigen eines OpenFileDialog-Dialogs, der eine Ereignisprozedur auslösen soll

 

Schreibe einen Kommentar