I'm working on a C# windows application, and would like to copy a row in a DataGridView and paste it into a new row. How I can achieve this? I am using .net framework 3.5.
Can you please provide me with some ideas or some code that would indicate how I could achieve this?
I have found a post that contains code to paste values from clipboard into DataGridView.
I was googling how to paste to DataGridView in C# from clipboard, an info, copied from Excel, and didn't find full answer. Collected couple of threads from forums and came up with this answer, hope it will make someones life easier. You dont have to understand the code just copy and paste
Below is a bit modified version. Beyond small refactoring I forbid paste into ReadOnly cells.
Usage example:
private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
ClipboardUtils.OnDataGridViewPaste(sender, e);
}
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Commons
{
public class ClipboardUtils
{
public static void OnDataGridViewPaste(object grid, KeyEventArgs e)
{
if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V))
{
PasteTSV((DataGridView)grid);
}
}
public static void PasteTSV(DataGridView grid)
{
char[] rowSplitter = { '\r', '\n' };
char[] columnSplitter = { '\t' };
// Get the text from clipboard
IDataObject dataInClipboard = Clipboard.GetDataObject();
string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);
// Split it into lines
string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries);
// Get the row and column of selected cell in grid
int r = grid.SelectedCells[0].RowIndex;
int c = grid.SelectedCells[0].ColumnIndex;
// Add rows into grid to fit clipboard lines
if (grid.Rows.Count < (r + rowsInClipboard.Length))
{
grid.Rows.Add(r + rowsInClipboard.Length - grid.Rows.Count);
}
// Loop through the lines, split them into cells and place the values in the corresponding cell.
for (int iRow = 0; iRow < rowsInClipboard.Length; iRow++)
{
// Split row into cell values
string[] valuesInRow = rowsInClipboard[iRow].Split(columnSplitter);
// Cycle through cell values
for (int iCol = 0; iCol < valuesInRow.Length; iCol++)
{
// Assign cell value, only if it within columns of the grid
if (grid.ColumnCount - 1 >= c + iCol)
{
DataGridViewCell cell = grid.Rows[r + iRow].Cells[c + iCol];
if (!cell.ReadOnly)
{
cell.Value = valuesInRow[iCol];
}
}
}
}
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With