Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 18 Programmiertechniken
Pfeil 18.1 Drag
Pfeil 18.1.1 Ablauf der Operation
Pfeil 18.1.2 Start der Operation
Pfeil 18.1.3 Ereignisse des Empfängers
Pfeil 18.1.4 Programmbeispiele
Pfeil 18.2 API-Aufrufe mit PInvoke
Pfeil 18.2.1 Das Attribut DllImport
Pfeil 18.2.2 Datentypen von API-Funktionen
Pfeil 18.3 Windows-Dienstanwendungen entwickeln
Pfeil 18.3.1 »Windows-Dienst«-Projekte in der Entwicklungsumgebung
Pfeil 18.3.2 Methoden eines Dienstes
Pfeil 18.3.3 Eigenschaften eines Dienstes
Pfeil 18.3.4 Installation eines Windows-Dienstes
Pfeil 18.3.5 Das Beispielprogramm FileWatchService
Pfeil 18.3.6 Dienste mittels Programmcode steuern
Pfeil 18.4 Die Zwischenablage
Pfeil 18.4.1 Speichern und Abrufen von Daten
Pfeil 18.4.2 Weitere Zugriffsmethoden
Pfeil 18.4.3 Mehrere Datenformate gleichzeitig
Pfeil 18.4.4 Eigene Datenformate schreiben
Pfeil 18.4.5 Leeren der Zwischenablage
Pfeil 18.4.6 Beispielprogramm Menü »Bearbeiten«

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


Galileo Computing - Zum Seitenanfang

18.1 Drag&Drop Zur nächsten ÜberschriftZur vorigen Überschrift

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 Strg -Taste während des Vorgangs gedrückt, wird kopiert, und die Kombination aus Taste Shift und Taste Strg -Taste bewirkt das Verknüpfen.

Da die Drag&Drop-Funktionalität in Control steckt, profitieren alle Steuerelemente davon.


Galileo Computing - Zum Seitenanfang

18.1.1 Ablauf der Operation Zur nächsten ÜberschriftZur vorigen Überschrift

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.


Galileo Computing - Zum Seitenanfang

18.1.2 Start der Operation Zur nächsten ÜberschriftZur vorigen Überschrift

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.


Tabelle 18.1 Die Enumeration »DragDropEffects«

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.


Galileo Computing - Zum Seitenanfang

18.1.3 Ereignisse des Empfängers Zur nächsten ÜberschriftZur vorigen Überschrift

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).


Tabelle 18.2 Eigenschaften in »DragEventArgs« (R = ReadOnly)

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 Taste Shift , Taste Strg , Taste Alt und der Maustasten (siehe Tabelle 18.3: Bitflags der Eigenschaft KeyState)

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


Tabelle 18.3 Bitflags der Eigenschaft »KeyState«

Bitflag Taste

1

linke Maustaste

2

rechte Maustaste

4

Taste Shift -Taste

8

Taste Strg -Taste

16

mittlere Maustaste

32

Taste Alt -Taste


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 Esc -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.


Tabelle 18.4 Die 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.



Galileo Computing - Zum Seitenanfang

18.1.4 Programmbeispiele topZur vorigen Überschrift

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 Strg -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 Strg -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


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual Basic 2008
Visual Basic 2008
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Visual Basic 2012






 Visual Basic 2012


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de