none
[HELP] Drag And Drop RRS feed

  • Domanda

  • Salve a tutti,

    Sto creando un applicazione e devo necessariamente implementare il DragDrop, il linguaggio che sto usando è VB.NET il framework 4.0 (no client) ora ho impostato AllowDrop = TRUE dalle proprieta dell'applicazione ora mi servirebbe aprire e leggere tutti i file di testo tramite una textbox che ho inserito nel form.

    Ho gia provato parecchi metodi trovati su web ma nessuno di questi ha funzionato, eccone alcuni:

    #Region "TextBox Drag Drop"
        ''' <summary>
        ''' Open text file
        ''' </summary>
        ''' <param name="sFile">Text File Name</param>
        Private Sub OpenFile(sFile As String)
            Try
                Dim StreamReader1 As New StreamReader(sFile)
                TextBox1.Text = StreamReader1.ReadToEnd()
                StreamReader1.Close()
            Catch ex As Exception
                MessageBox.Show(Me, ex.Message, "Errore nel caricare il file.")
            End Try
        End Sub
    
        Private Sub TextBox1_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
            ' If file is dragged, show cursor "Drop allowed"
            If e.Data.GetDataPresent(DataFormats.FileDrop) Then
                e.Effect = DragDropEffects.Copy
            Else
                e.Effect = DragDropEffects.None
            End If
        End Sub
    
        Private Sub TextBox1_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
            Try
                Dim a As Array = DirectCast(e.Data.GetData(DataFormats.FileDrop), Array)
    
                If a <> Nothing Then
                    Dim s As String = a.GetValue(0).ToString()
                    Me.Activate()
                    OpenFile(s)
                End If
                TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
            Catch ex As Exception
                MessageBox.Show("Errore nella funzione DragDrop: " + ex.Message)
            End Try
    
        End Sub
    
    #End Region
    
        Private Sub TextBox1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
            Dim files As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
            For Each file As String In files
                TextBox1.Text = file
            Next
    
        End Sub
    
        Private Sub TextBox1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
            e.Effect = DragDropEffects.All
        End Sub

    Premetto che il metodo nella region nel programma è un commento non sono riuscito ad usarlo per l'errore ricevuto qui:

    If a <> Nothing Then
    
    ....

    Mi dice che questi <> non sono validi,

    Come posso fare per implementare il drag drop?

    Dimenticavo ho anche cercato di usare questa guida: http://msdn.microsoft.com/it-it/library/aa289508(v=vs.71).aspx

    http://msdn.microsoft.com/en-us/library/Aa289508


    The key to your system are simple lines of code Nicola2

    venerdì 27 aprile 2012 14:10

Risposte

  • Innanzi tutto, vedo che nel codice che ci hai mostrato, gli eventi TextBox1.DragDrop e TextBox1.DragEnter sono dichiarati due volte. Immagino che quelli fuori dalla Region siano un refuso.

    Poi, il codice presenta un errore perché, nell'evento DragDrop, dapprima richiami il metodo OpenFile, per aprire il file che è stato trascinato sulla casella di testo, e ne assegni il contenuto alla proprietà Text, ma poi esegui quest'altra istruzione:

    TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
    

    Che fallisce perché, nel caso di Drag & Drop, il metodo GetData(DataFormats.Text) restituisce Nothing (perché il dato è, appunto, di tipo DataFormats.DragDrop).

    Sistemate queste due cose, e verificato che la proprietà AllowDrop della TextBox sia impostata su True, tutto funzionerà correttamente.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    • Proposto come risposta Irina Turcu lunedì 30 aprile 2012 03:28
    • Contrassegnato come risposta Nicola 2 lunedì 30 aprile 2012 12:24
    venerdì 27 aprile 2012 16:14

Tutte le risposte

  • Non devi usare <>, bensì:

    If Not IsNothing(a) then
    '...
    End if
    'Oppure
    If a IsNot Nothing then
    '...
    End if


    Giammi http://cubirubik.altervista.org

    venerdì 27 aprile 2012 14:37
  • ciao cosi ho risolto quell'errore ma non funziona il metodo, in pretica siamo di nuovo all'inizio.

    The key to your system are simple lines of code Nicola2


    • Modificato Nicola 2 venerdì 27 aprile 2012 15:40
    • Proposto come risposta Marco MinervaMVP lunedì 30 aprile 2012 13:25
    venerdì 27 aprile 2012 15:39
  • Innanzi tutto, vedo che nel codice che ci hai mostrato, gli eventi TextBox1.DragDrop e TextBox1.DragEnter sono dichiarati due volte. Immagino che quelli fuori dalla Region siano un refuso.

    Poi, il codice presenta un errore perché, nell'evento DragDrop, dapprima richiami il metodo OpenFile, per aprire il file che è stato trascinato sulla casella di testo, e ne assegni il contenuto alla proprietà Text, ma poi esegui quest'altra istruzione:

    TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
    

    Che fallisce perché, nel caso di Drag & Drop, il metodo GetData(DataFormats.Text) restituisce Nothing (perché il dato è, appunto, di tipo DataFormats.DragDrop).

    Sistemate queste due cose, e verificato che la proprietà AllowDrop della TextBox sia impostata su True, tutto funzionerà correttamente.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    • Proposto come risposta Irina Turcu lunedì 30 aprile 2012 03:28
    • Contrassegnato come risposta Nicola 2 lunedì 30 aprile 2012 12:24
    venerdì 27 aprile 2012 16:14
  • Innanzi tutto, vedo che nel codice che ci hai mostrato, gli eventi TextBox1.DragDrop e TextBox1.DragEnter sono dichiarati due volte. Immagino che quelli fuori dalla Region siano un refuso.

    Poi, il codice presenta un errore perché, nell'evento DragDrop, dapprima richiami il metodo OpenFile, per aprire il file che è stato trascinato sulla casella di testo, e ne assegni il contenuto alla proprietà Text, ma poi esegui quest'altra istruzione:

    TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString

    Che fallisce perché, nel caso di Drag & Drop, il metodo GetData(DataFormats.Text) restituisce Nothing (perché il dato è, appunto, di tipo DataFormats.DragDrop).

    Sistemate queste due cose, e verificato che la proprietà AllowDrop della TextBox sia impostata su True, tutto funzionerà correttamente.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva


    quindi come dovrei risolvere? potresti farmi un esempio

    The key to your system are simple lines of code Nicola2

    venerdì 27 aprile 2012 17:12
  • Ti ho chiarimente scritto quali sono i problemi, e quindi anche cosa devi fare per sistemare le cose... Cosa non ti è chiaro?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    venerdì 27 aprile 2012 17:14
  • Ti ho chiarimente scritto quali sono i problemi, e quindi anche cosa devi fare per sistemare le cose... Cosa non ti è chiaro?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Chiedo scusa era la stanchezza che faceva brutti scherzi, sistemato tutto ecco come ho sistemato la classe:

    #Region "TextBox Drag Drop"
        ''' <summary>
        ''' Open text file
        ''' </summary>
        ''' <param name="sFile">Text File Name</param>
        Private Sub OpenFile(sFile As String)
            Try
                Dim StreamReader1 As New StreamReader(sFile)
                TextBox1.Text = StreamReader1.ReadToEnd()
                StreamReader1.Close()
            Catch ex As Exception
                MessageBox.Show(Me, ex.Message, "Errore nel caricare il file.")
            End Try
        End Sub
    
        Private Sub TextBox1_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
            ' If file is dragged, show cursor "Drop allowed"
            If e.Data.GetDataPresent(DataFormats.FileDrop) Then
                e.Effect = DragDropEffects.Copy
            Else
                e.Effect = DragDropEffects.None
            End If
        End Sub
    
        Private Sub TextBox1_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
            Try
                Dim a As Array = DirectCast(e.Data.GetData(DataFormats.FileDrop), Array)
    
                If a IsNot Nothing Then 'If a <> Nothing Then
                    Dim s As String = a.GetValue(0).ToString()
                    Me.Activate()
                    OpenFile(s)
                End If
                'TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
            Catch ex As Exception
                MessageBox.Show("Errore nella funzione DragDrop: " + ex.Message)
            End Try
    
        End Sub

    Spero vada bene cosi,

    Ho notato anche che se eseguo il debug il drag and drop non viene eseguito mentre se eseguo il programma dalla cartella bin il drag and drop viene eseguito come mai?

    ma mi chiedo ora come faccio per inserire nella textbox solo il testo trascinato esempio se provo a trascinare il testo postato dal tuo messaggio sul notepad di windows lui lo legge ma se lo faccio sul mio programma mi esce il simbolo divieto come posso fare?


    The key to your system are simple lines of code Nicola2


    • Modificato Nicola 2 sabato 28 aprile 2012 12:52 Aggiunta Informazioni
    sabato 28 aprile 2012 12:50
  • Ho notato anche che se eseguo il debug il drag and drop non viene eseguito mentre se eseguo il programma dalla cartella bin il drag and drop viene eseguito come mai?

    Non è che stai eseguendo Visual Studio come amministratore? Perché, in questo caso, anche il tuo programma viene eseguito come amministratore, e Windows non permette il Drag & Drop tra un'applicazione eseguita con le credenziali utente e una che gira come amministratore. Ad esempio, se esegui la tua applicazione come amministratore, non puoi fare il Drag & Drop di un file dal destkop (che "gira" come un utente normale) alla tua applicazione.

    ma mi chiedo ora come faccio per inserire nella textbox solo il testo trascinato esempio se provo a trascinare il testo postato dal tuo messaggio sul notepad di windows lui lo legge ma se lo faccio sul mio programma mi esce il simbolo divieto come posso fare?

    Nell'evento DragEnter controlli che il formato sia DataFormats.FileDrop, quindi consenti solo il Drag & Drop di file. Se vuoi gestire anche il testo semplice, devi ammettere anche che il formato sia DataFormats.Text. Fatto questo, nell'evento DragDrop devi controllare il formato dei dati: se è DataFormats.FileDrop, esegui il codice attuale, altrimenti, se è DataFormats.Text. ti basta richiamare il metodo GetData (in pratica, l'istruzione che adesso hai commentato).


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    sabato 28 aprile 2012 13:05
  • Ho notato anche che se eseguo il debug il drag and drop non viene eseguito mentre se eseguo il programma dalla cartella bin il drag and drop viene eseguito come mai?

    Non è che stai eseguendo Visual Studio come amministratore? Perché, in questo caso, anche il tuo programma viene eseguito come amministratore, e Windows non permette il Drag & Drop tra un'applicazione eseguita con le credenziali utente e una che gira come amministratore. Ad esempio, se esegui la tua applicazione come amministratore, non puoi fare il Drag & Drop di un file dal destkop (che "gira" come un utente normale) alla tua applicazione.

    ma mi chiedo ora come faccio per inserire nella textbox solo il testo trascinato esempio se provo a trascinare il testo postato dal tuo messaggio sul notepad di windows lui lo legge ma se lo faccio sul mio programma mi esce il simbolo divieto come posso fare?

    Nell'evento DragEnter controlli che il formato sia DataFormats.FileDrop, quindi consenti solo il Drag & Drop di file. Se vuoi gestire anche il testo semplice, devi ammettere anche che il formato sia DataFormats.Text. Fatto questo, nell'evento DragDrop devi controllare il formato dei dati: se è DataFormats.FileDrop, esegui il codice attuale, altrimenti, se è DataFormats.Text. ti basta richiamare il metodo GetData (in pratica, l'istruzione che adesso hai commentato).


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva


    Ok perfetto ma come posso fare ad eseguire il drag drop dei file come utente normale quando l'applicazione gira come amministratore?

    The key to your system are simple lines of code Nicola2

    sabato 28 aprile 2012 16:23
  • Ok perfetto ma come posso fare ad eseguire il drag drop dei file come utente normale quando l'applicazione gira come amministratore?

    Non è possibile, Windows non lo permette.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    sabato 28 aprile 2012 16:27