Following on from exporting a DataGridView to a CSV file someone asked this week if it’s possible to copy the contents to the clipboard for pasting into another application.
The code below copies the content of the passed DataGridView to the clipboard inserting the specified delimiter between each column.
The basic idea is to scan each row and write the contents of the cell to a string builder, inserting the delimiter after each column (except the last one in the row). At the end of the row append a new line to the string builder. When the end of the grid is reached copy the contents of the string builder to the clipboard.
The procedure returns either true (if the DataGridView had data in it) or false (if the DataGridView is empty).
//accepts two parameters: // dgvGrid - reference to a valid DataGridView // colDelimiter - character(s) to insert between each column //returns: // true if the grid has rows // false if the grid has no rows private bool copyGridToClipboard(DataGridView dgvGrid, string colDelimiter) { //variable to hold the value stored in each cell string cellValue; //variable to hold the text extracted from the grid StringBuilder sb = new StringBuilder(); //set row and column count variables int rowCount = dgvGrid.RowCount; int colCount = dgvGrid.ColumnCount; //check to see if the grid has some rows if (rowCount > 0) { //initialise the varible to hold each grid row DataGridViewRow gridRow = new DataGridViewRow(); //loop through rows for (int row = 0; row <= rowCount - 1; row++) { //set gridRow to the current row gridRow = dgvGrid.Rows[row]; //loop through columns for (int col = 0; col <= colCount - 1; col++) { //if the gridRow cell is not null assign the contents to cellValue if (gridRow.Cells[col].Value != null) { cellValue = gridRow.Cells[col].Value.ToString(); } //otherwise set cell value to an empty string else { cellValue = string.Empty; } //append the cell value to the stringbuilder sb.Append(cellValue); //if the column is not the last one append the column delimiter if(col < colCount - 1) { sb.Append(colDelimiter); } } //end of row columns: so append newline to the stringbuilder sb.AppendLine(); }//end of final row: so copy the entire stringbuilder to the clipboard & return "true" Clipboard.SetData(System.Windows.Forms.DataFormats.Text, sb.ToString()); return true; }else //otherwise return "false" { return false; } }
Below is an example of calling the procedure (NB the calling form has a DataGridView called dgvExcel)
//call sending the DataGridView dgvExcel and a comma as the delimiter if (copyGridToClipboard(dgvExcel, ",")) { MessageBox.Show("Data Copied to the Clipboard", "Copy - Complete", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("No Data to Copy", "Copy - Failed", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
Source