Click here to Skip to main content
Click here to Skip to main content

Copy Paste in Datagridview Control

By , 8 Jun 2011
 

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:

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.

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)

About the Author

Balu Sathish
Software Developer Calpine Technologies
India India
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralThanksmemberMikles Max29 Apr '13 - 14:45 
Questionconvert to vb.netmembermr.fugio29 Nov '12 - 19:57 
Question...?memberMember 92618739 Aug '12 - 23:49 
GeneralGreat CodememberHolyHannah21 Jun '12 - 3:27 
GeneralMy vote of 5membermanoj kumar choubey5 Apr '12 - 7:53 
QuestionCopy and PastememberAnthony Fonseca5 Jul '11 - 16:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 8 Jun 2011
Article Copyright 2011 by Balu Sathish
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid