Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [VB 2010 win form] operazione drag and drop

    Ciao,

    Credevo che essendo una della operazione più comuni, fosse anche una delle più facili da trovare negli esempi, e invece sto incontrando molte difficoltà nel trovare un esempio semplice sull'utilizzo del drag and drop. Vorrei semplicemente copiare una label in un panel (cosi tanto per capire il meccanismo), ma niente. Per il mio stupido senso della facilità farei cosi:

    codice:
      Private Sub Label1_MouseMove1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseMove
            If e.Button = MouseButtons.Left Then
    
                Me.Label1.AllowDrop = True
                Me.Label1.DoDragDrop(Label1, DragDropEffects.Move)
    
                'Label1.Left = MousePosition.X
                'Label1.Top = MousePosition.Y
            End If
    
        End Sub
    .. ma ovviamente la label mi da un bel senso vietato..
    chi avrebbe la bontà d'animo di indicarmi dove posso cercare informazioni semplici su questo argomento?

    buona giornata a tutti

  2. #2
    interesserà anche a me...anch'io non ho trovato materiale a riguardo...

    Per adesso ti posso dire che il divieto ti viene fuori perchè il contenitore non l'hai abilitato al drop, controlla nelle proprietà del contenitore..
    Fai sapere..tutta la procedura sdi dropp, sarà una cosa che dovrò vedere meglio prossimamente anch'io!
    Michele

  3. #3
    ci avevo pensato.. ho impostato tutti gli oggetti (form, label, panel, anche il gatto) su allowdrop=true...

    ma niente.

  4. #4

  5. #5
    Originariamente inviato da eternauta
    ci avevo pensato.. ho impostato tutti gli oggetti (form, label, panel, anche il gatto) su allowdrop=true...

    ma niente.
    bene dall'esempio non mi sembra molto complicato...

    adesso dovrebbe funzionare anche con il gatto! non dropparlo ehh
    Michele

  6. #6


    grazie ragazzi, almeno qualche esempio decente..
    ..ma quale sarebbe l'esempio illuminante?? questo?

    http://www.vb-helper.com/howto_net_d...op_object.html

    ho capito qualcosina in più, ma se io volessi semplicemente trascinare un oggetto label in un oggetto panel?

    1- dovrei serializzare l'oggetto label? e come dovrei fare? per prova ho fatto questo:

    codice:
    Imports System.Runtime.Serialization
    
    
    <Serializable()> _
    Class form1
    
    
        Private Sub Label1_Mousedown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
            If e.Button <> MouseButtons.Left Then Exit Sub
    
            Dim lbl As Label = DirectCast(sender, Label)
            Dim app As String = lbl.Text
            lbl.DoDragDrop(app, DragDropEffects.Copy)
    
        End Sub
    
        Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragLeave
            Dim l As New Label
    
            l = DirectCast(sender, Label)
            Me.Panel1.Controls.Add(l)
    
        End Sub
    ma se ho capito al logica dell'esempio, non so riapplicarla al mio caso!

  7. #7
    ti sei perso con il comando e.Data.GetDataPresent , nel tuo caso si tratta di un controllo forms, quindi bisogna utilizzare e.Data.GetData...


    questo tutto il
    codice:
    Public Class Form1
        Private m_MouseIsDown As Boolean = False
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Panel1.AllowDrop = True
        End Sub
    
        Private Sub Label1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown, LinkLabel1.MouseDown
            m_MouseIsDown = True
        End Sub
    
        Private Sub Label1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseMove, LinkLabel1.MouseMove
            If m_MouseIsDown Then
                ' Initiate dragging and allow either copy or move.
                sender.DoDragDrop(sender, DragDropEffects.Move)
            End If
            m_MouseIsDown = False
        End Sub
    
        Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragDrop
    
            sender.controls.add(e.Data.GetData(GetType(Label)))
    
        End Sub
    
        Private Sub Panel1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragEnter
            If e.Data.GetData(GetType(Label)) IsNot Nothing Then
    
                e.Effect = DragDropEffects.Move
    
            Else
                e.Effect = DragDropEffects.None
            End If
        End Sub
    
    End Class
    l'ho provato adesso e funge..


    EDIT: per posizionare l'oggetto nel panel , più o meno si può fare così:

    codice:
        Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragDrop
    
            Dim Oggetto As Control = e.Data.GetData(GetType(Label))
            sender.controls.add(Oggetto)
            Oggetto.Location = New Point(Control.MousePosition.X - sender.Left - Me.Left - (Me.Width - Me.ClientSize.Width), Control.MousePosition.Y - sender.Top - Me.Top - (Me.Height - Me.ClientSize.Height))
    
        End Sub
    il problema è ricavare le coordinate del mouse all'interno del panel, ma se si tratta di altre posizioni (annidate) c'è perderci un po di tempo per renderlo funzionante per ogni situazione


    EDIT2.. ci sto perdendo un pò di tempo anch'io dato che servirà anche a me, compreso il posizionamento!
    per questo, ho creato un metodo nel form che resituisce le coordinate correnti del mouse relative a un controllo x forms

    basta copiare questo medoto nella classe del form :
    codice:
        Private Function GetMousePosition_IntoControl(ByVal Ctrl As Control) As Point
            Dim MousePos As New Point(Control.MousePosition)
            Do While Ctrl IsNot Nothing
                MousePos = Point.Subtract(MousePos, Ctrl.Location)
                If Ctrl.GetType = Me.GetType Then MousePos = Point.Subtract(MousePos,
                    New Point(Me.Width - Me.ClientSize.Width, Me.Height - Me.ClientSize.Height))
                Ctrl = Ctrl.Parent
            Loop
            Return MousePos
        End Function

    e quindi sarà chiamato nell'evento del drag and drop, così ..

    codice:
        Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragDrop
    
            Dim Oggetto As Control = e.Data.GetData(GetType(Label))
            sender.controls.add(Oggetto)
            Oggetto.Location = Me.GetMousePosition_IntoControl(sender)
    
        End Sub
    Michele

  8. #8


    Caro Michele ti Adoro!!! Grazie mille.

    ma senti qua.. se volessi mantenere la label anche nell'origine? Ho provato a sostituire move con copy. Ho provato anche a creare una nuova label che poi chiamava l'operazione di trascinamento (ma questo metodo mi sembra poco elegante.. e comunque non mi funziona).

    quando hai tempo.. e soprattutto se ne hai voglia!

  9. #9
    per adesso fai così.... se trovi qualcosa di più degno di questo metodo, fai sapere anche a me

    codice:
        Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragDrop
    
            Dim OrigineOggetto As Control = e.Data.GetData(GetType(Label))
            Dim NewOggetto As New Label
    
            With NewOggetto
                ' qua assegni le proprietà che ti interessano che vengano copiate per la nuova label
                .Text = OrigineOggetto.Text
                .Size = OrigineOggetto.Size
                .Location = Me.GetMousePosition_IntoControl(sender)
                '''' qualsiasi proprietà dell'oggetto copiato
                ''''
    
    
                sender.Controls.Add(NewOggetto)
                .BringToFront()
            End With
        End Sub
    Michele

  10. #10
    ..non penso che cercherò una soluzione più degna visto la tua è perfetta, semplice e funzionale..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.