Copia/Incolla in DataGridView
Pubblicato da Emanuele su Maggio 4, 2008
Spesso quando si sceglie di usare il controllo DataGridView è perchè non si vuole solo una rappresentazione tabellare dei dati, ma soprattutto perchè si voglione sfruttare funzioni che l’utente medio ritiene tipiche delle tabelle.
Una di queste funzioni è sicuramente il copia/incolla di interi record, funzione che non è presente nella classe DataGridView.
Ma questo non vuol dire che non si possa implementare!
Prima di tutto dobbiamo impostare la proprietà ClipboardCopyMode del DataGridView:
this.dataGridView.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
L’enumerazione DataGridViewClipboardCopyMode contiene quattro valori: con
EnableWithoutHeaderText è possibile copiare negli Appunti i valori di testo delle celle selezionate. Il testo dell’intestazione non viene incluso.
Andiamo ora a implementare i metodi Copia e Incolla.
Il metodo Copia è semplicissimo:
private void Copia() { Clipboard.SetDataObject(this.dataGridView.GetClipboardContent()); }
Con questo codice viene copiato nella Clipboard, attraverso il metodo static Clipboard.SetDataObject, i dati che tornano dal metodo GetClipboardContent() della classe DataGridView. Dati che vengono formattati in base al valore della proprietà ClipboardCopyMode.
Purtroppo il metodo Incolla non è così immediato:
private void Incolla() { char[] rowSplitter = { '\r', '\n' }; char[] columnsSplitter = { '\t' }; string[] campi; //Ottengo le informazioni contenute negli appunti string appunti = Clipboard.GetText(); //Divido gli appunti in righe string[] righe = appunti.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries); foreach (string str in righe) { //Divido la stringa in campi e aggiungo la riga del DataGridView campi = str.Split(columnsSplitter); if (campi.Length == 2) { this.bindingSource.AddNew(); DataRowView rowView = (DataRowView)this.bindingSource.Current; if (campi[3] == String.Empty) rowView[5] = DBNull.Value; else rowView[5] = int.Parse(campi[3]); if (campi[4] == String.Empty) rowView[4] = DBNull.Value; else rowView[4] = int.Parse(campi[4]); } } }
Il procedimento è però abbastanza semplice: prima di tutto otteniamo i dati presenti nella Clipboard attraverso il metodo statico Clipboard.GetText(). Quindi i dati così ottenuti vengono divisi prima in righe, splittandoli sui valori ‘\r’ ‘\n’, e in seguito vengono splittati in colonne (\t). I dati così ottenuti vengono inseriti nel controllo DataGirdView.
A questo punto resta da implementare solo il ContextMenu che conterrà i menu Copia e Incolla con i rispettivi eventi Click che richiamano ki metodi Copia e Incolla.
Per fare questo si deve prima aggiungere un ContextMenu al progetto e poi associarlo al controllo DataGridView intercettando l’evento RowContextMenuStripNeeded del DataGridView:
private void dataGridView_RowContextMenuStripNeeded(object sender, DataGridViewRowContextMenuStripNeededEventArgs e) { e.ContextMenuStrip = this.contextMenuCopiaIncolla; }
Praticamente, ogni volta che si preme col tasto destro sul DataGridView, viene generato l’evento RowContextMenuStripNeeded che imposta la proprietà e.ContextMenuStrip sul contextMenu che contiene i menu Copia e Incolla.
Il risultato finale è simile a questo: