Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

Copy Paste in Datagridview Control

4.71/5 (13 votes)
8 Jun 2011CPOL 122.6K   5.8K  
How to copy paste in Datagridview control

Introduction

This post discusses how to add a datagridview and a contextmenustrip with cut, copy and paste into the form.

Image 1

Populate the DataGridView and define the click events as follows:

C#
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (dataGridView1.SelectedCells.Count > 0)
        dataGridView1.ContextMenuStrip = contextMenuStrip1;
}

private void cutToolStripMenuItem_Click(object sender, EventArgs e)
{
    //Copy to clipboard
    CopyToClipboard();

    //Clear selected cells
    foreach (DataGridViewCell dgvCell in dataGridView1.SelectedCells)
        dgvCell.Value = string.Empty;
}

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
    CopyToClipboard();
}

private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
{
    //Perform paste Operation
    PasteClipboardValue();
}

Copy/Paste routines follow...

The clipboard values are saved in a Dictionary, so the user can validate or manipulate the values before assigning them into gridviewcell.

C#
private void CopyToClipboard()
{
    //Copy to clipboard
    DataObject dataObj = dataGridView1.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);
}

private void PasteClipboardValue()
{
    //Show Error if no cell is selected
    if (dataGridView1.SelectedCells.Count == 0)
    {
        MessageBox.Show("Please select a cell", "Paste", 
		MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    //Get the starting Cell
    DataGridViewCell startCell = GetStartCell(dataGridView1);
    //Get the clipboard value in a dictionary
    Dictionary<int, Dictionary<int, string>> cbValue = 
			ClipBoardValues(Clipboard.GetText());

    int iRowIndex = startCell.RowIndex;
    foreach (int rowKey in cbValue.Keys)
    {
        int iColIndex = startCell.ColumnIndex;
        foreach (int cellKey in cbValue[rowKey].Keys)
        {
            //Check if the index is within the limit
            if (iColIndex <= dataGridView1.Columns.Count - 1
            && iRowIndex <= dataGridView1.Rows.Count - 1)
            {
                DataGridViewCell cell = dataGridView1[iColIndex, iRowIndex];

                //Copy to selected cells if 'chkPasteToSelectedCells' is checked
                if ((chkPasteToSelectedCells.Checked && cell.Selected) ||
                    (!chkPasteToSelectedCells.Checked))
                    cell.Value = cbValue[rowKey][cellKey];
            }
            iColIndex++;
        }
        iRowIndex++;
    }
}

private DataGridViewCell GetStartCell(DataGridView dgView)
{
    //get the smallest row,column index
    if (dgView.SelectedCells.Count == 0)
        return null;

    int rowIndex = dgView.Rows.Count - 1;
    int colIndex = dgView.Columns.Count - 1;

    foreach (DataGridViewCell dgvCell in dgView.SelectedCells)
    {
        if (dgvCell.RowIndex < rowIndex)
            rowIndex = dgvCell.RowIndex;
        if (dgvCell.ColumnIndex < colIndex)
            colIndex = dgvCell.ColumnIndex;
    }

    return dgView[colIndex, rowIndex];
}

private Dictionary<int, Dictionary<int, string>> ClipBoardValues(string clipboardValue)
{
    Dictionary<int, Dictionary<int, string>>
    copyValues = new Dictionary<int, Dictionary<int, string>>();

    String[] lines = clipboardValue.Split('\n');

    for (int i = 0; i <= lines.Length - 1; i++)
    {
        copyValues[i] = new Dictionary<int, string>();
        String[] lineContent = lines[i].Split('\t');

        //if an empty cell value copied, then set the dictionary with an empty string
        //else Set value to dictionary
        if (lineContent.Length == 0)
            copyValues[i][0] = string.Empty;
        else
        {
            for (int j = 0; j <= lineContent.Length - 1; j++)
                copyValues[i][j] = lineContent[j];
        }
    }
    return copyValues;
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)