Verständnisproblem mit MouseMove (Bearbeitet)

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Verständnisproblem mit MouseMove (Bearbeitet)

    Hey leute.
    Ich hoffe Ihr könnt mir helfen!!!!

    Ich hab ein Problem was Drag&Drop angeht.

    Hab im Internet schon gegoogelt und auch paar dinge gefunden. Nur leider find ich den Fehler nicht :(

    Ich habe eine Form "Startseite" und eine Form "Zuordnungsform"
    Auf der Form "Startseite" die ein IsMdiContainer ist, habe ich eine Listbox die ich "Listbox" nenne und ein Button1 (der nur die Zuordnungsform erstellt)--> soll später anderweitig passieren

    Die zweite Form "Zuordnungsform" besitzt nur eine Listbox die ich ebenfalls "Listbox" nenne. (Sind ja zwei unterschiedliche Classen)

    Nun will ich (vorerst nur) von der "Startseite" per Drag&Drop Inhalte der Listbox (Startseite) in die Listbox (Zuordnungsform) verschieben. Und umgekehrt!!!!
    Später entstehen mehrere Zuordnungsformen wo ich die Begrifflichkeiten zwischen der Startseitenlistbox und Zuordnungsform-listboxen und Zuordnungsform-listboxen und Zuordnungsform-listboxen hin und her verschieben kann.. unendlich oft ... aber das später ;)


    Es entsteht das Zeichen, dass ein Drag&Drop stattfindet (Mauszeiger verändert sich) aber wenn ich es in die andere Listbox Einfüge, passiert nix und kommt im Direktfenster die Meldung:

    Eine Ausnahme (erste Chance) des Typs "System.InvalidCastException" ist in MeinProgramm.exe aufgetreten.

    Ich hoffe Ihr könnt mir Helfen!!!!
    und schonmal ganz herzlichen Dank!!!!

    PS: Bild wie es aussieht zu verdeutlichung hab ich beigefügt!

    Ich habe folgenden Code für meine Startseite.

    VB.NET-Quellcode

    1. Public Class Startseite
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim lb1 As ZuordnungsForm = New ZuordnungsForm 'erstellen einer Zuordnungsform
    4. lb1.MdiParent = Me 'die ein Kind von der Startseite sein soll
    5. lb1.Show() 'zeigen der Zuordnungsform
    6. End Sub
    7. Private Sub ListBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragDrop
    8. Dim filestr() As String
    9. If e.Data.GetDataPresent(DataFormats.Text) Then
    10. filestr = e.Data.GetData(DataFormats.Text)
    11. ListBox.Items.Add(filestr)
    12. End If
    13. End Sub
    14. Private Sub ListBox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragEnter
    15. e.Effect = DragDropEffects.Move
    16. End Sub
    17. Private Sub ListBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox.MouseMove
    18. If (e.Button = Windows.Forms.MouseButtons.Left) And ListBox.SelectedIndex >= 0 Then
    19. ListBox.DoDragDrop(ListBox.SelectedItem.ToString, DragDropEffects.Move)
    20. End If
    21. End Sub
    22. End Class



    Hier der Code für die Zuordnungsform

    VB.NET-Quellcode

    1. Public Class ZuordnungsForm
    2. Private Sub ListBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragDrop
    3. Dim filestr() As String
    4. If e.Data.GetDataPresent(DataFormats.Text) Then
    5. filestr = e.Data.GetData(DataFormats.Text)
    6. MsgBox("test")
    7. ListBox.Items.Add(filestr)
    8. End If
    9. End Sub
    10. Private Sub ListBox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragEnter
    11. If e.Data.GetDataPresent(DataFormats.Text) Then
    12. e.Effect = DragDropEffects.Move
    13. End If
    14. End Sub
    15. Private Sub ListBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox.MouseMove
    16. If (e.Button = Windows.Forms.MouseButtons.Left) And ListBox.SelectedIndex >= 0 Then
    17. ListBox.DoDragDrop(ListBox.SelectedItem.ToString, DragDropEffects.Move)
    18. End If
    19. End Sub
    20. End Class
    Bilder
    • Mein Programm.jpg

      48,07 kB, 987×619, 150 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BlackWest“ () aus folgendem Grund: Neue Problematik mit dem selben Programm

    Leider hilfts nicht!!
    Das mit StringFormat hatte ich auch schon aus einem anderem Beispiel ausprobiert!!

    könnte es sein, da ich über zwei verschieden Formen gehe, dass ich vorher irgendwie der Startseitenlistbox sagen muss, von wem diese alles Drag&Drops empfangen darf??? bzw. auch umgekehrt??

    Problem... es würd mit der Allgemeinen variante ja irgendwie nicht klappen, es sei denn, ich würde 100 verschiedene listboxen eintragen!??!?!
    Ich hab jetz soweit schonmal nen Fehler ermittelt,
    dass wenn ich von der Startseiten-Listbox etwas in die Zuordnungslistbox verschieben will, stürzt mir das Programm bei folgender Passage ab...
    bzw. springt plötzlich in Mouse_Move.. anstatt weiter zu machen.

    Code von der Listbox der Zuordnungsform!!!

    VB.NET-Quellcode

    1. Private Sub ListBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragDrop 'klappt noch
    2. Dim filestr() As String 'klappt noch
    3. 'Dim str As String 'klappt noch
    4. If e.Data.GetDataPresent(DataFormats.Text) Then 'klappt noch
    5. filestr = e.Data.GetData(DataFormats.Text) 'springt noch rein.. danach startet sofort Mouse_move
    6. MsgBox("test") ' wird nicht mehr ausgeführt!!!
    7. ListBox.Items.Add(filestr) 'wird nicht mehr ausgeführt
    8. End If


    woran kann das liegen????
    Hey Super !!! :)
    Es klappt..
    jezt bin ich grad nur noch verwirrt, warum er trotz des "DragDropEffects.Move" den Wert in der Listbox beibehält und nicht löscht nach dem "Move"

    Wo ist dann bitteschön der unterschied zwischen DragDropEffects.Move und DragDropEffects.Copy???

    Gruß BlackWest
    soweit ich weiß das aussehen der Maus^^
    wenn du den Item aus der anderen Liste raushaben willst musst du diesen selbstständig mit Remove entfernen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hat jemand vllt eine Idee, mit welchem Event ich das Remove implementieren könnte?
    Normalerweise würd ich das ja im DragDrop Event der Empfangenden Listbox einfügen nur dafür fehlt mir ja die Information, aus welcher Listbox es gerade wirklich gezogen wurde.
    Da es ja zwischen allen Listboxen möglich sein soll!!!

    Gruß BlackWest
    im MouseMove Event, nach diesem: ListBox.DoDragDrop(ListBox.SelectedItem.ToString, DragDropEffects.Move)
    dass das nachher auf jede ListBox angewendet wird, kannst du mit AddHandler lösen und jeder ListBox dynamisch dieses Event zu weisen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    vom AddHandler hab ich schonmal was gehört... Aber noch nie angewendet.

    Drum hab ich grad au leider keine Ahnung.
    ABER:

    Wenn ich doch ein DragDrop ereignis ausgeführt habe..
    z.B.
    ListBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox.DragDrop

    Wenn ich mich nicht irre, ist doch das "Sende-Objekt" in der Var. Sender gespeichert. Kann ich mir das nicht zu nutze machen??
    weil in diesem Falle gäbe es ja eh immer nur EINEN Sender!!
    doch kannst du(und außerdem gibt es in einem Moment nur einen sender, aber sobald du mehrere ListBox hast und bei der anderen dasselbe machst, wird diese - wenn richtig programmiert - dasselbe Event aufrufen)

    VB.NET-Quellcode

    1. Dim listBox As ListBox = DirectCast(sender,ListBox)
    2. 'listBox ist jetzt sender und voll Einsatzfähig

    AddHandler funktioniert so:

    AddHandler ListBox.DasEreigniss,AddressOf DerMethodenname
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    OK ich werd´s mal Ausprobieren.
    Kann mir das mit dem AddHandler besser vorstellen, wie ich das Implementieren könnte als die andere Variante.
    Die verwirrt mich gerade doch nur .. ;)

    Meine Zuordnungsformen sollen ja Dynamisch erstellt werden. oder auch in einem Array mit einer Laufvariablen worüber ich diese Anspreche.

    z.B. Zuordnungsform_1,Zuordnungsform_2,Zuordnungsform_3 usw

    d.h. ich muss mir ein "Sub" Programmieren z.B. "Entfernen".. wo ich sage.. dass das Item mit dem Index (x) gelöscht werden soll

    Ich würde dann sagen.
    AddHandler Zuordnungsform(i) , AddressOf Entfernen

    oder mach ich das schon wieder zu kompliziert?
    nicht nur zu kompliziert, sondern irgendwie auch vollkommen falsch :P:

    VB.NET-Quellcode

    1. Public Sub ListBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    2. Dim ListBox As ListBox = DirectCast(sender,ListBox)
    3. If (e.Button = Windows.Forms.MouseButtons.Left) And ListBox.SelectedIndex >= 0 Then
    4. ListBox.DoDragDrop(ListBox.SelectedItem.ToString, DragDropEffects.Move)
    5. End If
    6. End Sub

    und sobald eine neue ListBox irgendwo erstellt wird(von mir aus lstTest)
    AddHandler lstText.MouseMove,AddressOf ListBox_MouseMove
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich Danke soweit schonmal.
    Aber ich glaube, bevor ich deine / eure Zeit noch mehr in Anspruch nehme, sollte ich mich lieber erstmal selbst mit dem "AddHandler" beschäftigen.
    Bzw. mit dem
    Dim ListBox As ListBox = DirectCast(sender,ListBox)
    weil so ist die Hilfe vermutlich schon sehr gut nur ich kann sie nicht umsetzen ;)
    weil mir da doch noch ein Stück Kenntnis fehlt!!
    sender As Obect, also ist sender vom Typ Object, mit diesem kannst du hier nicht richtig arbeiten, da dieser nicht die Methode DoDragDrop implementiert hat, da wir aber wissen, dass es eine ListBox sein wird, können wird diese direkt konvertieren Lassen(mit DirectCast): DirectCast(zu_konvertierendes_Objekt, KonvertierenInDiesenType)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    für mich zum Verständnis:

    D.h. Wenn ich in einem DragDrop oder MouseMove Event eine Var. mit dem namen "Sender" habe.. (was jetz auch immer im Sender gespeichert ist)

    Convertiere ich die Var. "Sender" in eine Listbox die mit dem namen "listbox" angesprochen werden kann.. vllt zu verdeutlichung von mir..

    Dim Vorübergehende_Listbox as Listbox = DirectCast(Sender,Listbox)

    Nun Beinhaltet die "Vorübergehende_Listbox alle vom Sender enthaltene Daten.. Sprich.. Vorübergehende_Listbox IST meine Sendende Listbox???

    Vorübergehende_Listbox kann ich jetz wie ne Normale "Listbox" ansprechen und sagen, Lösch mir den gesendeten Wert ... was dann auch in der Sendenden Listbox passiert und nicht nur in der Vorübergehnden_Listbox??

    Ist das so die Logik??
    Nochmal ne Frage zum MouseMove Event.
    Das gesamte Programm mach das was es soll. Es löscht mir aus der Sendenden Listbox den Wert.
    Verständnisproblem von mir:

    MouseMove heißt doch.. Führe dies Programm aus, sobald sich die Maus über der Listbox befindet / bewegt wird.
    D.h. Es müsste doch sofort, wenn ich das Item aus der Listbox anklicke aus dieser Verschwinden.
    Jedoch verschwindet das Item aus der Sendenden LB erst, wenn ich die Maustaste über einer anderen oder der selben LB loslasse.

    WIESO? Ich verstehs nicht! :(

    VB.NET-Quellcode

    1. Private Sub ListBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox.MouseMove
    2. If (e.Button = Windows.Forms.MouseButtons.Left) And ListBox.SelectedIndex >= 0 Then ' Wenn linke Maustaste geklickt ist UND das Angeklickte Item >0 = ist dann
    3. ListBox.DoDragDrop(ListBox.SelectedItem.ToString, DragDropEffects.Move) 'initialisiere einen DragDrop vorgang
    4. Dim Vorübergehende_Listbox As ListBox = DirectCast(sender, ListBox) ' Ermittelt die Sendende Liste und '
    5. Vorübergehende_Listbox.Items.RemoveAt(Vorübergehende_Listbox.SelectedIndex) ' entfernt den Wert aus dieser Liste
    6. If Vorübergehende_Listbox.Items.Count = 0 Then 'Wenn die Liste leer ist.. Schließe diese.
    7. Me.Close()
    8. End If
    9. End If
    10. End Sub


    Gruß BlackWest