Panel in Panel nach ziehen durch Maus fixieren

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Denis Cla0.

    Panel in Panel nach ziehen durch Maus fixieren

    Hallo,

    ich bin gerade an einer etwas aufwendigeren Anwendung. Hier habe ich Probleme weiter zu kommen.

    Bis jetzt gibt es mehrere Panels mit jeweils 5 Textboxen beinhaltend.
    Diese Panels sind (Ursprungsposition linke Seite der Form untereinander angeordnet) frei mit der Maus verschiebbar.
    Die Daten der TextBoxen in den Panels sind sortiert in einer DB. Das Oberste Panel ist Zeile 1. Dessen Textfelder sind in der DB von links nachs recht die Spalten A bis E. Folgende Panels jeweils eine Zeile darunter.
    Durch das verschieben möchte ich eine intuitive Art programmieren diese Panels auf der rechten Seite der Form neu zu sortieren, wie der Benutzer es gerne hätte.
    Ich hoffe das Beispiel-Bild verdeutlicht die Anwendung ein wenig!

    Meine 2 Probleme:

    -Wie kann ich beim verschieben die neue Positition der Panels auf der rechten Seite der Form wieder in eine strukturierte Form bringen? Ich hatte dran gedacht, dass die Panels(mit den Textboxen) in anderen Panels(leer) auf der rechten seite "gefangen" werden, sobald Sie diese berühren und die Maustaste losgelassen wird. Wie mache ich das am besten?

    -Wenn die verschiebbaren Panels nun auf der rechten seite neu angeordnet sind, wie bekomme ich dann einen Bezug auf meine DB? Also wenn ich zb: das Panel1 (Linke Seite ganz oben) auf die rechte Seite an die 3 Stelle schieben möchte, sollten in einer zweiten DB die Daten des Panel1 in der dritten Zeile stehen! Nicht mehr wie in der Ursprungsdatenbank in der ersten Zeile.
    Bilder
    • Frame.JPG

      52,17 kB, 1.122×651, 153 mal angesehen
    Du musst einfach die Positionen bestimmen, wenn du das Panel schiebst , dort wo du hinwillst und loslässt, musst du gucken, wo das geschobene Objekt gerade liegt, also ind welcher zeile, und dann eine fixe Position eintragen.

    Und zu deinem zweiten Problem, kann man auch mit den Positionen arbeiten. Die Panels sind ja schön untereinander geordnet. Da musst du nurnoch gucken welchen y-Wert das Panel hat, und dann die Zeile daraus bestimmen
    „Ex-ter-mi-nate all knock-knock jokes! They are an enemy of the daleks “ A Dalek
    Mein Blog zum Thema Klarträumen
    Hallo Pascal,

    danke für die Info. Ich habe das mal Probiert. Mein Problem 2 habe ich nun gelöst. =)

    Aber bei Problem 1. Ich bekomme das Daten-Panel nicht automatisch in ein leeres zentriert. Kannst Du mir da konkreter weiterhelfen?

    Danke!
    Danke, das wird aber erstmals ne "Krüke". Denn mit dem Dockstyle hab ich das Problem, dass sich mein DatenPanel überall fixieren kann; für den Fall, dass ich später noch andere Panels, die im ersten Moment nix damit zu haben einfüge!

    Aber vorerst hilft mir das mal!
    du gibst den panels auf der rechten seite den tag "ziel" oder ähnlich

    mit deiner for each schleife gehste beim loslassen des panels alle controls durch

    VB.NET-Quellcode

    1. for each c as control in me.controls


    dann fragst du ab ob das control ein panel ist

    VB.NET-Quellcode

    1. if typeof c is panel


    und danach nochmal ob der tag von c "ziel" ist

    VB.NET-Quellcode

    1. if directcast(c,panel).tag = "ziel"


    jetzt bist du bereit das panel einzusetzen, also fragst du z.b. ab(habe das so gebaut, dass es ins mouseup event rein muss wegen dem sender)

    VB.NET-Quellcode

    1. DirectCast(Panel1, Panel).Bounds.IntersectsWith(DirectCast(c, Panel).Bounds)


    jetzt baust du noch dazu dass er das panel einsetzt, 100% c&p gibts ned^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    Hey Leute.
    Die einfachste Lösung, für jedes einzelne Panel. Einfach wenn das DatenPanel die Hälfte des Panels auf der Rechten Seite überschreitet dessen Location annehmen. Dann muss ich eig nur für jedes Panel 2 Zeilen Tippen.

    Private Sub Panel1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseUp
    If Panel1.Location.X >= 825 Then
    Panel1.Location = Panel2.Location
    End If

    Ist zwar nicht die schönste Code-Lösung, aber die die am schnellsten und sichersten funktioniert. Sorry aber das viele Codeschreiben kenn ich noch von Java...