Non Solo .Net

C#, C++, WPF, WCF e molto altro

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:

ImmagineCopiaIncolla

Technorati Tag: ,,

Lascia una Risposta

XHTML: Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>