| |
VB.NET - Fortgeschrittene DragDrop von einer Textbox in eine andere mit ContextMenu-Auswahl | | | Autor: ewaldvb | Datum: 12.09.11 17:12 |
| Hallo zusammen!
Folgendes Problem:
In einer Form2 habe ich mehrere TextBoxes. Einige davon mit AllowDrop=TRUE, das ergibt sich aufgrund von zuvor in Form1 eingebenen Werten. wenn ich nun die Form2 lade werte ich die AllowDrop-Eigenschften für jedes Control in der Form2 aus und setze dafür die Event-Handler _DragEnter und _DragDrop. Nun kann ich die Inhalte von einer TextBox in eine andere einfach "hinüber ziehen".
So, nun möchte ich aber auf der Ziel-Textbox ein Kontextmenü mit diversen Auswahlen z.B. Kopieren, Verschieben, ..., Abbrechen;
Wenn ich nun die Items aus dem KontextMenü auf "Clicked" abfrage ist die DoDragDrop-Function bereits fertig, und ich habe keinen Bezug auf die ursprüngliche (Quell-) Textbox, beim "Move" muss ich ja die Quell-Textbox ausleeren. Da ich diese Methode aber beliebig einfügen will, und ich eigentlich gar nicht weiß, ob und wann diese Routine zur Anwendung kommt tu ich mir schwer die Quell-Textbox zu merken.
Der Ablauf stellt sich so dar:
1. QuellTextBox.MouseDown:
1.1 - DoDragDrop, mit Text und AllowedDragEffects
2. ZielTextBox.DragEnter:
2.1 - Setze/Prüfe die DragEffects
3. ZielTextBox.DragDrop:
3.1 - Hier möchte ich das Kontextmenü aufrufen und die MenuItems abfragen, wenn AllowedEffects COPY und MOVE (sonst nur COPY)
3.2 - Den Text aus "e.Data.GetData..." in die ZieltextBox schreiben
1.2 Zurück nach QuellTextBox
1.3 - zum 1. Statement nach DoDragDrop
1.4 - END SUB (von QuellTextBox.MouseDown)
4. Erst hier kommt die Abfrage der Kontext-MenuItems
4.1 Nun weiß ich, ob MOVE oder COPY
- Aber viel zu spät!
Gibt es eine Möglichkeit, das Control der Quell-TextBox vor oder nach 3.2 abzufragen, um damit etwas machen zu können, oder zwischen 1.2 und 1.4 die Items des KontextMenüs abfzufragen?
Hoffentlich weiß jemand was!
LG
Ewald | |
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! | |
Re: DragDrop von einer Textbox in eine andere mit ContextMenu-Auswahl | | | Autor: FZelle (Moderator) | Datum: 12.09.11 23:26 |
| Schon mal dran gedacht, das man auch in klassen ganz normale Variablen zwischenspeichern kann?
Da muss man nicht mit Gewalt irgendwelche Menüs benutzen. | |
Re: DragDrop von einer Textbox in eine andere mit ContextMenu-Auswahl | | | Autor: ewaldvb | Datum: 13.09.11 10:40 |
| FZelle schrieb:
Zitat: | | Schon mal dran gedacht, das man auch in klassen ganz normale
Variablen zwischenspeichern kann?
Da muss man nicht mit Gewalt irgendwelche Menüs
benutzen. | |
Ja, ja, weiß schon.
Nur, so hab ich die Möglichkeit ohne weiteres zutun die Routinen überall anders auch weiter zu verwenden. Da hab ich eben so meine Macken....
danke trotzdem.
LG Ewald | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|
|
|
Copyright ©2000-2024 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
|
|