Copy DataGridView to Clipboard

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).

[csharp gutter=”false”]
//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;
}
}
[/csharp]

Below is an example of calling the procedure (NB the calling form has a DataGridView called dgvExcel)

[csharp gutter=”false”]
//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);
} }

[/csharp]

This entry was posted in Programming and tagged , , , , . Bookmark the permalink.

Leave a Reply