Der Nutzwert eines Programms wird durch einige Techniken deutlich erhöht. Die Bedienung wird durch Drag&Drop und die Zwischenablage vereinfacht. Hintergrundaktivitäten sind gut in Windows-Diensten aufgehoben. Was im .NET Framework fehlt, wird in der Win-API aufgerufen.
18 Programmiertechniken
18.1 Drag&Drop 

Drag&Drop gehört zu den fundamentalsten Techniken der Windows-Betriebssysteme. Es erlaubt, ein Objekt zu markieren und es bei gedrückter Maustaste an eine andere Stelle zu ziehen. Der Empfänger kann sich sowohl in derselben als auch in einer anderen Anwendung befinden. Unterstützend erhält der Anwender während des Ziehvorgangs ein visuelles Feedback, wenn sich der Mauszeiger über einer Komponente befindet, die in der Lage ist, das gezogene Objekt aufzunehmen. Diese Technik wird beispielsweise im Windows Explorer dazu benutzt, Dateien in ein anderes Verzeichnis zu verschieben oder zu kopieren.
Bei Drag&Drop-Vorgängen spielen immer zwei Elemente eine Rolle: die Quelle, aus der ein Objekt gezogen wird, und der Empfänger, der das Objekt entgegennimmt. Beim Kopieren erhält der Empfänger eine Kopie des Objekts, beim Verschieben wird das Objekt in der Quelle gelöscht, und bei einer Verknüpfungsoperation verweisen sowohl die Quelle als auch das Ziel auf dasselbe Objekt.
Der Status der Umschalttasten entscheidet, ob eine Operation ein Objekt kopiert, verschiebt oder verknüpft. Wird keine Taste gedrückt, handelt es sich üblicherweise um eine Verschiebeoperation. Ist die
-Taste während des Vorgangs gedrückt, wird kopiert, und die Kombination aus
und
-Taste bewirkt das Verknüpfen.
Da die Drag&Drop-Funktionalität in Control steckt, profitieren alle Steuerelemente davon.
18.1.1 Ablauf der Operation 

Normalerweise werden Drag&Drop-Operationen als Reaktion auf das MouseDown-Ereignis ausgelöst. Meistens ist es die linke Maustaste, in manchen Anwendungen sind aber auch Operationen über die rechte möglich. Um eine Drag&Drop-Operation einzuleiten, wird im Ereignishandler die Methode DoDragDrop der Quelle der Operation aufgerufen.
Nicht jede Komponente ist automatisch ein potenzieller Empfänger der Drag&Drop-Operation. Vielmehr müssen die Komponenten, die als Empfänger in Frage kommen, die Eigenschaft AllowDrop=True eingestellt haben.
Während des Ziehvorgangs treten mehrere Ereignisse auf. Am wichtigsten sind DragEnter und DragDrop. Da mit Drag&Drop die verschiedensten Datenformate bewegt werden können (Zeichenfolgen, Dateien, Images usw.), muss jeder potenzielle Empfänger einer Drag&Drop-Operation überprüfen, ob er das aktuell gezogene Datenformat überhaupt aufnehmen kann. Das passiert im Ereignis DragEnter. Das Ablegen des gezogenen Objekts erfolgt dann im Ereignis DragDrop.
18.1.2 Start der Operation 

Die Methode DoDragDrop löst die Drag&Drop-Operation aus. Im ersten Parameter wird das zu bewegende Objekt übergeben. Der zweite Parameter vom Typ DragDropEffects beschreibt, welche Operationen mit dem Objekt möglich sind.
DoDragDrop(data As Object, allowed As DragDropEffects) As DragDropEffects |
Die Methode wird erst beendet, wenn die Operation abgeschlossen ist. Der Rückgabewert der Methode beschreibt, wie der Empfänger die Daten entgegengenommen hat. In vielen Fällen werden Sie den Rückgabewert ignorieren können.
Die in Tabelle 18.1 gezeigten Mitglieder der Enumeration DragDropEffects können bitweise verknüpft werden, um mit einem Methodenaufruf mehrere verschiedene Operationen zu erlauben.
Konstante | Beschreibung |
None |
Die Daten werden vom Ziel nicht akzeptiert. |
Copy |
Die Daten werden in das Ziel kopiert. |
Move |
Die Daten aus der Quelle werden in das Ziel verschoben. |
Link |
Die Daten aus der Quelle werden mit dem Ziel verknüpft. |
Scroll |
Der Bildlauf wird begonnen oder momentan im Ziel durchgeführt. |
All |
Die Daten werden kopiert, aus der Quelle entfernt und über einen Bildlauf im Ablageziel abgelegt. |
So einfach im ersten Moment das Einleiten einer Drag&Drop-Operation erscheinen mag, als so schwierig kann es sich bei der Programmierung erweisen. Der Grund dafür ist, dass einige Steuerelemente bei einem Click-Ereignis eine Standardreaktion zeigen. Die Problematik ist, zwischen dem Standardverhalten und der Drag&Drop-Operation zu unterscheiden.
18.1.3 Ereignisse des Empfängers 

Der Empfänger muss als solcher konfiguriert sein, standardmäßig ist das nicht der Fall. Durch die Zuweisung von True an AllowDrop signalisiert ein Steuerelement seine Empfangsbereitschaft.
Public Overridable Property AllowDrop As Boolean |
Bei einer als Empfänger registrierten Komponente spielen vier Ereignisse eine Rolle:
- Public Event DragEnter As DragEventHandler
- Public Event DragOver As DragEventHandler
- Public Event DragDrop As DragEventHandler
- Public Event DragLeave As EventHandler
Schauen wir zunächst auf die Umstände, unter denen die Ereignisse ausgelöst werden.
- Das Ereignis DragEnter wird ausgelöst, wenn der Mauszeiger den Bereich eines Drag&Drop-Empfängers betritt. Dies kann eine Form oder ein Steuerelement sein. Im Ereignis wird geprüft, ob das Steuerelement unter dem Mauszeiger das Datenformat des gezogenen Objekts aufnehmen kann. Solange das nicht der Fall ist, wird eine Art Verbotsschild angezeigt, und es wird beim Loslassen der Maustaste kein DragDrop-Ereignis ausgelöst – die Operation wird ohne Datentransfer abgebrochen.
- DragOver tritt wie MouseOver kontinuierlich auf, während die Maus über die Komponente bewegt wird. Für Verschiebe- und Kopiervorgänge werden dabei verschiedene Cursor angezeigt. Im Windows Explorer beispielsweise ist es ein Pfeil bei einer Verschiebeoperation, und beim Kopieren wird der Pfeil durch ein »+«-Zeichen ergänzt. Über einem Element, das kein Empfänger einer Drag&Drop-Operation ist, wird das Verbotsschild angezeigt.
- Wird die gedrückte Maustaste über einem empfangsbereiten Element losgelassen, wird in diesem das DragDrop-Ereignis ausgelöst und das Objekt abgelegt. Der Ereignishandler des Empfängers bestimmt, was mit dem losgelassenen Objekt gemacht wird.
- Wird mit gedrückter Maustaste der Bereich eines möglichen Empfängers verlassen, wird dessen Ereignis DragLeave ausgelöst. Es wird recht selten benötigt.
Parameterliste der Ereignishandler
Dem Ereignishandler von DragLeave wird ein EventArgs-Objekt übergeben, das keine ereignisrelevanten Daten liefert. Anders sieht es bei den drei Ereignissen DragEnter, DragDrop und DragOver aus. Diese Ereignishandler erhalten ein DragEventArgs-Objekt, das in seinen Eigenschaften Informationen über die laufende Operation anbietet (Tabelle 18.2).
Eigenschaft | Beschreibung | |
AllowedEffect |
Dem Empfänger von der Quelle zur Verfügung gestellte Operationen (Kopieren, Verschieben, Verknüpfen). Es ist der durchgereichte zweite Parameter von DoDragDrop vom Typ DragDropEffects. |
R |
Data |
Enthält die dem Ereignis zugeordneten Daten vom Typ IDataObject. |
R |
Effect |
Operation, die beim Fallenlassen ausgeführt wird. Das visuelle Feedback sollte den Wert widerspiegeln. Deshalb ist standardmäßig der Mauszeiger automatisch vom Wert abhängig. Am besten erfolgt eine Umschaltung in DragEnter, ohne sie weiß der Benutzer nicht, dass ein Drop möglich ist. Erlaubt ist nur ein Wert aus AllowedEffect. |
|
KeyState |
Aktueller Zustand von
|
R |
X, Y |
X- bzw. y-Koordinate des Mauszeigers in Bildschirmkoordinaten |
R |
Hinweis |
Das Format IDataObject der gezogenen Daten erläutere ich in Abschnitt 18.4, »Die Zwischenablage«. |
Beachten Sie bitte, dass X und Y die Koordinaten des Mauszeigers auf dem Bildschirm liefern. Diese Werte können mit der PointToClient-Methode einfach in die Koordinaten eines Steuerelements se umgerechnet werden.
Dim pt As Point = se.PointToClient(Me.MousePosition)
Die KeyState-Eigenschaft ist erstaunlicherweise nicht wie sonst üblich eine Enumeration, sondern beschreibt den Zustand aller in Frage kommenden Tasten über einen Integer. Da KeyState das Flags-Attribut hat, werden die in Tabelle 18.3 gezeigten Werte bitweise kombiniert und interpretiert.
Public ReadOnly Property KeyState As Integer |
Bitflag | Taste |
1 |
linke Maustaste |
2 |
rechte Maustaste |
4 |
|
8 |
|
16 |
mittlere Maustaste |
32 |
|
Das QueryContinueDrag-Ereignis der Ereignisquelle
Für das Steuerelement, das für die Drag&Drop-Operation die Quelle darstellt, werden kontinuierlich QueryContinueDrag-Ereignisse ausgelöst. Das Ereignis bietet sich insbesondere an, um einen eingeleiteten Vorgang vorzeitig abzubrechen und dabei festzulegen, was mit dem gezogenen Objekt passieren soll. Der Ereignishandler bekommt ein Objekt vom Typ QueryContinueDragEventArgs mit drei Eigenschaften übergeben:
- Action
- EscapePressed
- KeyState
KeyState beschreibt, welche Tasten während der Operation gedrückt sind (siehe Tabelle 18.3, »Bitflags der Eigenschaft KeyState«), und EscapePressed gibt an, ob die
-Taste gedrückt wurde. Mit Action lässt sich der Status der andauernden Operation bestimmen und deren Fortgang festlegen. Diese Eigenschaft ist vom Typ der in Tabelle 18.4 gezeigten Enumeration DragAction.
Konstante | Beschreibung |
Cancel |
Die Operation wird abgebrochen, und die Daten werden nicht abgelegt. |
Continue |
Die Operation wird fortgesetzt. |
Drop |
Die Operation wird beendet, und die Daten werden abgelegt. |
18.1.4 Programmbeispiele 

An den folgenden vier Beispielen wollen wir uns nun ansehen, wie Drag&Drop realisiert werden kann. Im ersten Beispiel wird nur eine einfache Operation zwischen zwei Textboxen gezeigt, im zweiten eine Operation, bei der zwischen zwei Pictureboxen ein Bildchen hin- und hergeschoben bzw. kopiert wird. Drag&Drop zwischen zwei Listboxen ist nur unter erheblichem Programmieraufwand möglich, wenn die Listboxen eine Mehrfachauswahl zulassen. Das dritte Beispiel stellt dazu eine gleichwertige Alternative vor, die anstelle von Listboxen ListView-Steuerelemente benutzt. Im letzten Beispiel wird Ihnen abschließend gezeigt, wie Dateien bei einer Drag&Drop-Operation behandelt werden können.
Drag&Drop zwischen Textboxen
Die Form des folgenden Beispiels enthält die beiden Textboxen TextBox1 und TextBox2. Der Inhalt von TextBox1 soll mittels Drag&Drop in die TextBox2 verschoben oder kopiert werden. Zum Kopieren muss während des Ziehvorgangs die
-Taste gedrückt sein. Die Eigenschaft AllowDrop von TextBox2 ist auf True eingestellt.
'...\Programmiertechniken\DragDrop\Textboxen.vb |
Public Class Textboxen
Private Sub Start1(sender As Object, e As MouseEventArgs) _
Handles TextBox1.MouseDown
TextBox1.DoDragDrop(TextBox1.Text, _
DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
Private Sub Enter2(sender As Object, e As DragEventArgs) _
Handles TextBox2.DragEnter
If e.Data.GetDataPresent(DataFormats.Text) Then
If (e.KeyState And 8) = 8 Then ' ob Strg-Taste gedrückt
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.Move
End If
Else
e.Effect = DragDropEffects.None
End If
End Sub
Private Sub Drop2(sender As Object, e As DragEventArgs) _
Handles TextBox2.DragDrop
TextBox2.Text = e.Data.GetData(DataFormats.Text)
If (e.KeyState And 8) <> 8 Then TextBox1.Clear() ' ohne Strg-Taste
End Sub
End Class
Eingeleitet wird die Drag&Drop-Operation mit dem Drücken der linken Maustaste im Textfeld TextBox1. Dabei wird die Methode DoDragDrop aufgerufen, der im ersten Argument die zu erfassenden Daten mitgeteilt werden – hier der gesamte Inhalt von TextBox1. Im zweiten Argument ist festgelegt, dass die Daten sowohl verschoben als auch kopiert werden können.
TextBox1.DoDragDrop(TextBox1.Text, _
DragDropEffects.Copy Or DragDropEffects.Move)
Betritt der Mauszeiger bei gleichzeitig gedrückter linker Maustaste den Bereich des Objekts TextBox2, wird das Ereignis DragEnter ausgelöst. Im Ereignishandler stellen wir zunächst einmal fest, ob die von der aktuellen Drag&Drop-Operation erfassten Daten im Textformat vorliegen. Aus einer anderen Quelle heraus können ja Daten verschoben werden, die nicht im Text-, sondern zum Beispiel im Bildformat vorliegen. Dann darf die Textbox natürlich nicht ihre Bereitschaft signalisieren, solche Daten aufnehmen zu können. Nach der Prüfung
If e.Data.GetDataPresent(DataFormats.Text) Then
wird getestet, ob die
-Taste gedrückt ist oder nicht. Wenn ja, werden die Daten – falls sie in der Textbox TextBox2 fallen gelassen werden – kopiert, andernfalls nur verschoben. Das dazugehörige Symbol wird durch die Übergabe einer DragDropEffects-Konstanten an die Eigenschaft Effects festgelegt, beispielsweise:
e.Effect = DragDropEffects.Copy
Hinweis |
Die Zuweisung an Effect legt fest ob überhaupt Daten empfangen werden können und gegebenenfalls wie. Der Standardwert None unterbindet den Empfang; wir sehen das Verbotsschild. Daher gilt: Es gibt keine Aktion ohne vorherige Festlegung von Effect. |
Wird die Maustaste über TextBox2 losgelassen, kommt es zum Ereignis DragDrop. Hier werden die Daten in das Objekt TextBox2 geschrieben (die Konvertierung in String erfolgt automatisch). Außerdem muss überprüft werden, ob es sich um eine Verschiebe- oder Kopieroperation handelt. Im ersteren Fall werden die Daten in der Quelle gelöscht.
Da Drag&Drop auch anwendungsübergreifend funktioniert, können Sie aus einem beliebigen textbasierten Dokument heraus Daten verschieben. Andererseits wird das Verschieben beispielsweise einer Bitmap-Datei von der Textbox im Beispielprogramm ignoriert.
Drag&Drop zwischen Pictureboxen
Genauso einfach wie Zeichenfolgen können Bilder verschoben werden. Der Code unterscheidet sich nur geringfügig, nur der abweichende Datentyp ist zu beachten.
Im folgenden Beispiel enthält die Form zwei Pictureboxen. Nach dem Start enthält PictureBox1 ein Bild, das in PictureBox2 entweder verschoben oder kopiert werden kann. Weil es nur geringfügig mehr Codierungsaufwand bedeutet, ist in diesem Beispiel die Drag&Drop-Operation in beide Richtungen möglich. Dazu werden die Ereignisse MouseDown, DragEnter und DragDrop mit dem gleichen Ereignishandler verknüpft. Im DragDrop-Ereignishandler ist für den Fall, dass eine Verschiebeoperation vorliegt, in der richtigen Quelle das Bild zu löschen. Dazu ist die Referenz des sender-Parameters zu überprüfen.
Hinweis |
Für eine PictureBox taucht AllowDrop weder im Eigenschaftsfenster noch in der IntelliSense-Liste auf. Die Zuweisung erfolgt daher im Code des Load-Ereignisses. |
'...\Programmiertechniken\DragDrop\Pictureboxen.vb |
Public Class Pictureboxen
Private strFile As String = IO.Path.Combine("Bilder", "Egypt.jpg")
Private img As Image = Image.FromFile(strFile)
Private Sub Laden(sender As Object, e As EventArgs) Handles MyBase.Load
PictureBox1.AllowDrop = True
PictureBox2.AllowDrop = True
PictureBox1.Image = img
End Sub
Private Sub Start(sender As Object, e As MouseEventArgs) _
Handles PictureBox1.MouseDown, PictureBox2.MouseDown
Dim pb As PictureBox = CType(sender, PictureBox)
If pb.Image IsNot Nothing Then _
pb.DoDragDrop(pb.Image, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
Private Sub Eintritt(sender As Object, e As DragEventArgs) _
Handles PictureBox1.DragEnter, PictureBox2.DragEnter
If e.Data.GetDataPresent(DataFormats.Bitmap) Then
If (e.KeyState And 8) = 8 Then ' ob Strg-Taste gedrückt
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.Move
End If
Else
e.Effect = DragDropEffects.None
End If
End Sub
Private Sub Ende(ByVal sender As Object, ByVal e As DragEventArgs) _
Handles PictureBox1.DragDrop, PictureBox2.DragDrop
Dim pb As PictureBox = CType(sender, PictureBox)
pb.Image = e.Data.GetData(DataFormats.Bitmap)
pb = If(pb Is PictureBox1, PictureBox2, PictureBox1)
If (e.KeyState And 8) <> 8 Then pb.Image = Nothing
End Sub
End Class
Drag&Drop zwischen Listen
Wenn Sie die Elemente zwischen zwei Listen mit Drag&Drop verschieben oder kopieren wollen, wird es etwas schwieriger. Normalerweise werden Sie sich bei einer Liste für den Typ ListBox entscheiden, der jedoch Probleme bereitet, wenn mehrere Listenelemente an der Operation teilnehmen sollen. In solchen Fällen ist der Typ ListView empfehlenswerter.
Das Steuerelement ListView hat, ebenso wie TreeView, ein zusätzliches Ereignis, mit dem das Ziehen eines oder mehrerer Elemente erleichtert wird: ItemDrag. Dieses Ereignis tritt beim Beginn des Ziehens auf. Über die Eigenschaften des Args-Parameters kann man die bei dem Vorgang gedrückte Maustaste sowie das zu ziehende Element ermitteln, aber meistens wird der Ereignishandler nur dazu benutzt, die Methode DoDragDrop aufzurufen.
Im folgenden Beispielprogramm können die Listenelemente von zwei ListView-Objekten beliebig verschoben werden. Die Form enthält zwei der Steuerelemente, deren AllowDrop-Eigenschaft selbstverständlich wieder auf True gesetzt ist. Da standardmäßig nur eine einfache Auswahl möglich ist, sollte die Mehrfachauswahl mit der Eigenschaft MultiSelect eingestellt werden. Um die Listbox zu simulieren, ist View=List gewählt, aber es kann natürlich auch aus den anderen angebotenen Ansichten heraus verschoben werden.
Sehen wir uns zuerst den Code des ItemDrag-Ereignishandlers an, der mit beiden Listenansichten verknüpft ist.
'...\Programmiertechniken\DragDrop\ListViews.vb |
Public Class ListViews
Private Sub Ziehen(sender As Object, e As ItemDragEventArgs) _
Handles ListView1.ItemDrag, ListView2.ItemDrag
Dim listview As ListView = CType(sender, ListView)
Dim items(listview.SelectedItems.Count – 1) As ListViewItem
For i As Integer = 0 To listview.SelectedItems.Count – 1
items(i) = listview.SelectedItems(i)
Next
listview.DoDragDrop(New DataObject("ListViewItemData", items), _
DragDropEffects.Move)
End Sub
...
End Class
Zuerst wird ein Array vom Typ ListViewItem deklariert und mit den ausgewählten Listenelementen aus der SelectedListViewItemCollection der Listenansicht gefüllt. Beim Aufruf der DoDragDrop-Methode müssen zuerst die an der Operation beteiligten Daten spezifiziert werden. Damit auch wirklich nur die dafür vorgesehene Listenansicht die Daten empfangen kann, erzeugen wir ein eigenes DataObject. Dazu übergeben wir dem Konstruktor zuerst einen beliebigen Bezeichner für die zu verschiebenden Daten, anschließend die Daten selbst. Als Operation ist in diesem Beispiel nur das Verschieben vorgesehen.
Im Drag&Drop-Empfänger wird zuerst das Ereignis DragEnter ausgelöst. In diesem werden die gezogenen Daten auf ihren Typ geprüft. Hier fragen wir nach dem Bezeichner, den wir DataObject-Konstruktor genannt haben. Sind die Daten vom Typ ListViewItemData, kann der Verschiebevorgang initialisiert werden.
'...\Programmiertechniken\DragDrop\ListViews.vb |
Public Class ListViews
...
Private Sub Eintritt(sender As Object, e As DragEventArgs) _
Handles ListView1.DragEnter, ListView2.DragEnter
e.Effect = If(e.Data.GetDataPresent("ListViewItemData"), _
DragDropEffects.Move, DragDropEffects.None)
End Sub
...
End Class
Dem Fallenlassen der gezogenen Daten und dem damit ausgelösten Ereignis DragDrop kommt jetzt nur noch die Aufgabe zu, den Empfänger mit den gezogenen Listenelementen zu füllen und diese gleichzeitig in der Quelle zu löschen.
'...\Programmiertechniken\DragDrop\ListViews.vb |
Public Class ListViews
...
Private Sub Ende(sender As Object, e As DragEventArgs) _
Handles ListView1.DragDrop, ListView2.DragDrop
Dim ziel As ListView = CType(sender, ListView)
Dim items() As ListViewItem = e.Data.GetData("ListViewItemData")
For i As Integer = 0 To items.Length – 1
ziel.Items.Add(items(i).Text)
Next
Dim quelle As ListView = If(ziel Is ListView1, ListView2, ListView1)
For Each item As ListViewItem In quelle.SelectedItems
quelle.Items.Remove(item)
Next
End Sub
End Class
Drag&Drop von Dateien
Das letzte Beispielprogramm soll Ihnen demonstrieren, wie Dateien gezogen werden – hier im Besonderen Dateien mit Textinhalt; aber andere Dateitypen verfahren analog. Die Dateien können beispielsweise aus dem Windows Explorer in die Textbox der Form gezogen werden. Der Dateiinhalt wird dabei in der Textbox angezeigt.
Das Datenformat von Dateien, die an einer Drag&Drop-Operation teilnehmen, wird durch das Feld FileDrop der Klasse DataFormat beschrieben. Die Methode GetData liefert dann den Zugriffspfad auf die gezogene Datei. Wenn im Windows Explorer mehrere Dateien gezogen werden, liegt ein Array vor, das in ein Zeichenfolge-Array konvertiert werden muss.
Das Array wird in einer Schleife Element für Element durchlaufen. Nach einer Überprüfung der Dateierweiterung (es sind nur Dateien mit den Endungen .txt, ,ini und .log zugelassen) wird die sich jeweils im Zugriff befindliche Datei geöffnet und im Fenster angezeigt.
'...\Programmiertechniken\DragDrop\Dateien.vb |
Public Class Dateien
Private Sub Start(sender As Object, e As DragEventArgs) _
Handles Texte.DragEnter
e.Effect = If(e.Data.GetDataPresent(DataFormats.FileDrop), _
DragDropEffects.Link, DragDropEffects.None)
End Sub
Private Sub Ende(sender As Object, e As DragEventArgs) _
Handles Texte.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Texte.Clear()
' alle im Explorer ausgewählten Dateien
Dim strFileName() As String = e.Data.GetData(DataFormats.FileDrop)
' alle ausgewählten Dateien in der Textbox anzeigen
Dim ext() As String = New String() {".txt", ".log", ".ini"}
For Each datei As String In strFileName
If Not ext.Contains(IO.Path.GetExtension(datei)) Then Continue For
Texte.Text += New String("="c, 60) & Environment.NewLine
Texte.Text += "Datei: " & datei & Environment.NewLine
Try
Texte.Text += IO.File.ReadAllText( _
datei, System.Text.Encoding.Default)
Catch ex As Exception
Texte.Text += "Fehler " & ex.Message & Environment.NewLine
End Try
Next
End If
End Sub
End Class
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.