Oppure

Loading
12/02/16 10:54
robypiro
Ti ringrazio tantissimo :hail: . Il tuo esempio funziona alla perfezione e direi che, senza il tuo aiuto, non ci sarei mai arrivato!
Purtroppo mi trovo ora davanti ad un altro problema: l'intercetto del crtl+c sopra il datagridview sembra funzionare solo ogni tanto o in modo strano... Mi spiego, se faccio questa prova:

    Private Sub DataGridView1_KeyDown(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyDown
        If e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.C Then
            MsgBox("CRTL+C")
        End If
    End Sub


Ogni volta che premo ctrl+c sopra il datagridview, mi appare, correttamente, il popup di avviso "CTRL+C". Ma se inserisco all'interno di quell'if il tuo codice di esempio e poi vado ad incollare su outlook, la maggior parte delle volte mi copia il contenuto della datagridview in maniera non formattata come se il codice non ci fosse, poi, qualche volta invece, copia la tabella di esempio. E' come se windows avesse una specie di precedenza sulla gestione della clipboard rispetto al codice del programma stesso.
Questo problema lo posso aggirare inserendo un pulsantino "COPIA" sopra il datagridview e poi faccio spingere quello agli utenti per copiare le righe, però questa cosa è abbastanza strana...
aaa
12/02/16 11:38
GN
---
EDIT: ho trovato una soluzione più semplice, non per il DataGridView, ma siccome è sempre Windows Forms potrebbe funzionare comunque. stackoverflow.com/questions/1650648/…. Il "trucco" starebbe nel settare la proprietà SuppressKeyPress degli EventArgs per disattivare l'operazione di default dell'evento. Se non dovesso funzionare, vedi qui di seguito.
---

Il problema, probabilmente, è che "a volte" (non so in base a cosa) viene eseguita prima l'operazione di default del CTRL+C (che copia nel modo "sbagliato";) e dopo quella del tuo codice, mentre altre volte il contrario. L'ultima operazione che scrive la clipboard sovrascrive quello che vi è stato inserito appena prima. Cercando velocemente ho trovato questo thread: stackoverflow.com/questions/19363628/…. Leggi la prima risposta: suggerisce di creare un nuovo controllo, scrivendo una classe che estende DataGridView, in cui fare l'override del metodo ProcessCmdKey; al suo interno verifichi se la combinazione di tasti è quella che ti interessa e in tal caso la gestisci, altrimenti rimandi la chiamata al metodo della superclasse che gestisce l'input di altri tasti. Mi pare che in VB.NET vi s acceda tramite MyBase (al posto di base in C#).
Ultima modifica effettuata da GN 12/02/16 11:41
aaa
12/02/16 14:37
robypiro
Grandissimo! Il suppresskey fa bene il suo lavoro. Ora posso fare tranquillamente il ctrl+c sul datagridview poi il crtl+v su outlook.
Però non sembra essere ancora finita! Se seleziono molte righe, non viene copiato nulla e in più, smette di copiare dopo che ho fatto un pò di ctrl+c e ctrl+v in serie. Ho pensato che potesse essere un problema della dimensione dell'header dove dobbiamo dichiarare la dimensione dei dati e quindi ho aumentato i numeri di zeri portandolo dagli attuali 6 fino ad 11, ma continua a comportarsi nello stesso modo. Ho provato anche ad inserire un clipboard.clear() all'inizio della procedura in caso che fosse necessario fare una pulizia dei dati della copiatura precedente, ma non cambia niente...
aaa
12/02/16 16:57
GN
Non so quale possa essere il problema, però per debuggare potrebbe esserti utile questo tool che visualizza il contenuto della clipboard: peterbuettner.de/develop/tools/clipview/. Prova a vedere se noti qualcosa di anomalo nel caso con "molte righe" (non so a che ordine di grandezza ti riferisci, comunque quello che da problemi) rispetto a quello in cui funziona.
aaa
14/02/16 11:23
Harlock
robypiro la selezione multipla di righe puoi controllarla con un ciclo che itera per ogni riga a cui applichi il codice.
resetta tutte le variabili per ogni riga.
aaa
14/02/16 11:29
Harlock
in alternativa cioè per ogni riga costruisci il dettaglio del rigo da passare non tutta la procedura che hai sviluppato. ridefinendo i valori delle
variabili iniziali alla lunghezza di tutte le righe aggiunte.
aaa
15/02/16 10:55
robypiro
Grazie del programmino è molto carino. Utilizzandolo riesco a vedere il contenuto della clipboard, ma non ci vedo nessuna differenza tra i copia/incolla che funzionano e quelli che non funzionano. Il problema sembra manifestarsi quando la dimensione della clipboard supera i 2000 byte. Mi sembra una dimensione molto esigua per creare problemi, però è l'unica cosa che ho notato...

Postato originariamente da GN:

Non so quale possa essere il problema, però per debuggare potrebbe esserti utile questo tool che visualizza il contenuto della clipboard: peterbuettner.de/develop/tools/clipview/. Prova a vedere se noti qualcosa di anomalo nel caso con "molte righe" (non so a che ordine di grandezza ti riferisci, comunque quello che da problemi) rispetto a quello in cui funziona.
aaa
15/02/16 20:26
GN
Mi dispiace ma a questo punto non saprei più bene cosa dirti... Nel visualizzatore della clipboard (quel programmino) il contenuto è giusto? Perchè se lo è mi verrebbe quasi da pensare possa essere un problema di Outlook... Ho provato a fare velocemente un frammento di codice che crea una tabella di 100 righe e 100 colonne, in Clipboard viewer vedo che la dimensione e di circa 162kB (quindi decisamente di più dei 2kB di cui parli) e incollare in Word, e l'operazione va a buon fine, a parte il fatto che la tabella appare graficamente "sballata" ma immagino sia a causa del formato A4 di default in Word, comunque viene incollato tutto perchè alla fine del documento (382 pagine) vedo che c'è l'ultima casella (il frammento di codice che genera l'HTML le numera).
aaa