Principale utente con più risposte
[HELP] Drag And Drop

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
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
Tutte le risposte
-
-
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
-
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
-
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 esempioThe key to your system are simple lines of code Nicola2
-
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 -
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: @marcominervaChiedo 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
-
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 -
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
-
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