| |

VB.NET - Fortgeschrittene Re: DragDrop von einer Textbox in eine andere mit ContextMenu-Auswahl | |  | Autor: ewaldvb | Datum: 12.09.11 21:51 |
| Danke, hat sich erledigt!
ich habs so gelöst:
(ist vielleicht nicht ganz elegant, aber funzt perfekt)
Habe an das Kontextmenü ein weiteres (letztes) MenuItem drangehängt.
Da kommt die Handle vom aktuellen (= sender) Control als String hinein und wird auf Visible=FALSE gesetzt.
Dann den ganzen Drag/Drop durchlaufen.
Und Jetzt kommts:
unter 4.1 weiss ich ja erst obs ein MOVE oder ein COPY (oder sonst was) war.
Genau hier kann ich jetzt mittels der Handle den Text des Quell-Control's löschen.
So sieht's aus:
' Auf Klassen-Ebene:
Dim ConTxtMenuAs New ContextMenu
' Auf der Form müssen ein paar Textboxes plaziert sein,
' und eine names "QuellTextBox".
' Einige der anderen Textboxes sollten AllowDrop=TRUE gesetzt haben.
' Beim Starten der Form, z.B. hier:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Das Kontextmenü mit seinen Items muss für die ganze Klasse (Form) definiert
' sein
ConTxtMenu.MenuItems.Clear()
ConTxtMenu.MenuItems.Add("Hierher Kopieren")
ConTxtMenu.MenuItems.Add("Hierher Verschieben")
ConTxtMenu.MenuItems.Add("Abbrechen")
' Das wird das (letzte) Item mit der Handle:
ConTxtMenu.MenuItems.Add("ObjectHandle")
ConTxtMenu.MenuItems.Item(ConTxtMenu.MenuItems.Count - 1).Visible = _
False
' Die Event-Handler werden auch gleich zugewiesen; z.B:
AddHandler ConTxtMenu.MenuItems.Item(0).Click, AddressOf _
Me.ConTxtMenu_ItemClicked
AddHandler ConTxtMenu.MenuItems.Item(1).Click, AddressOf _
Me.ConTxtMenu_ItemClicked
AddHandler ConTxtMenu.MenuItems.Item(2).Click, AddressOf _
Me.ConTxtMenu_ItemClicked
' Den Controls die Drag/Drop-Handler zuweisen:
For Each ctl As Control In Me.Controls
If ctl.AllowDrop = True Then ' Nur wenn auch AllowDrop gesetzt ist
AddHandler ctl.DragEnter, AddressOf Me.target_DragEnter
AddHandler ctl.DragDrop, AddressOf Me.target_DragDrop
End If
Next
' ... Ende von Starten der Form
End Sub
' hier kommen jetzt die EventHandling's:
Private Sub QuellTextBox_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles QuellTextBox.MouseDown
' könnte ebenso auch dynamisch an ein Control gebunden sein
' ... div. Code
' Im letzten MenuItem steht als String die Handle des aktuellen Controls (
' QuellTextBox)
ConTxtMenu.MenuItems.Item(ConTxtMenu.MenuItems.Count - 1).Text = _
Convert.ToString(sender.Handle)
' Initialisiere und starte den Drag/Drop-Vorgang
sender.DoDragDrop(sender.Text, DragDropEffects.Copy Or _
DragDropEffects.Move)
' ... div. Code
End Sub
Private Sub target_DragEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs)
' Dieser Handler wurde dynamisch der jeweiligen TextBox zugeordnet
' Die erlaubten Effect's übernehmen
e.Effect = e.AllowedEffect
End Sub
Private Sub target_DragDrop(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs) _
' Dieser Handler wurde dynamisch der jeweiligen TextBox zugeordnet
' ... div. Code
' Zeige das Kontextmenü an
ConTxtMenu.Show(sender, New Point(20, 1))
' Jetzt den Text hier herein kopieren (könnte auch den Text aus dem
' [Handle].Text nehmen)
sender.Text = e.Data.GetData(DataFormats.Text)
' ... div. Code
End Sub
Private Sub ConTxtMenu_ItemClicked(ByVal sender As Object, ByVal e As _
System.EventArgs)
' Dieser Handler wurde eingangs den MenuItems zugeordnet
' siehe "4.1" der obigen Schilderungen, bzw. der Problemstellung
Dim mnuItem As MenuItem = sender
' Hier wird die Handle von String über Int64 wieder in einen IntPtr
' zurückgewandelt
Dim hndle As IntPtr = _
New IntPtr(Convert.ToInt64(ConTxtMenu.MenuItems.Item( _
ConTxtMenu.MenuItems.Count - 1).Text))
If mnuItem.Index = 1 Then ' das MenuItem(1); Verschieben? ...
Control.FromHandle(hndle).Text = Nothing ' ... und die QuellTextBox
' ausleeren
End If
End Sub Sollte dennoch jemand die "elegante" Lösung parat haben, dann bitte melden.
Schönen Abend! |  |
 | 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 |
  |
|
sevISDN 1.0 
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) sevGraph (VB/VBA) 
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|