vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DragDrop von einer Textbox in eine andere mit ContextMenu-Auswahl 
Autor: ModeratorFZelle (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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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