- Copy
- Paste
- Cut
- Events
- Handling Programmatically
- Customizing Copy Paste behavior
Contact Support
Clipboard Operations in UWP DataGrid (SfDataGrid)
28 Feb 202522 minutes to read
SfDataGrid provide support for the clipboard operations such as cut, copy and paste the data within control and between other applications such as Notepad, Excel. Clipboard operations copy and paste is enabled by default. You can copy selected records/cells from SfDataGrid by pressing Ctrl+C and also can paste the content from Clipboard to SfDataGrid by pressing Ctrl+V.
NOTE
Clipboard operations is not supported for the summary rows, add new row and unbound rows.
Copy
Copy operation works based on GridCopyOption property.GridCopyOption
provides the following options,
None – Disables copy in SfDataGrid.
CopyData – Enabled copy in SfDataGrid.
IncludeHeaders – Column header also copied along with data.
IncludeFormat – Copies the display text with format instead of actual value.
IncludeHiddenColumn – Hidden column also copied to clipboard.
You have to use IncludeHeaders
, IncludeFormat
, IncludeHiddenColumn
options along with CopyData
option.
<syncfusion:SfDataGrid x:Name="dataGrid"
SelectionUnit="Row"
SelectionMode="Single"
GridCopyOption="CopyData,IncludeHeaders"
ItemsSource="{Binding Orders}"/>
this.dataGrid.GridCopyOption = GridCopyOption.CopyData | GridCopyOption.IncludeHeaders;
NOTE
IncludeHiddenColumn
is not supported whenSelectionUnit
isCell
.
Paste
Paste operation works based on GridPasteOption property. GridPasteOption
provides the following options,
None – Disable paste in SfDataGrid.
PasteData – Enabled paste in SfDataGrid and when an incompatible value is pasted into a record/cell, the pasting operation is skipped for that particular record/cell.
ExcludeFirstLine – This can be used when pasting data copied with IncludeHeaders
copy option.
IncludeHiddenColumn – Paste the values in hidden columns also.
You have to use ExcludeFirstLine
, IncludeHiddenColumn
options along with PasteData
option.
<syncfusion:SfDataGrid x:Name="dataGrid"
SelectionUnit="Row"
SelectionMode="Single"
GridPasteOption="PasteData,ExcludeFirstLine"
ItemsSource="{Binding Orders}"/>
this.dataGrid.GridPasteOption = GridPasteOption.PasteData | GridPasteOption.ExcludeFirstLine;
Cut
Cut operation works based on GridCopyOption property. GridCopyOption
provides the following options,
None – Disables cut in SfDataGrid.
CutData – Enabled cut in SfDataGrid.
IncludeHeaders – Column header also copied along with data.
IncludeFormat – Cut the display text with format instead of actual value.
IncludeHiddenColumn – Hidden column also cut to clipboard.
You have to use IncludeHeaders
, IncludeFormat
, IncludeHiddenColumn
options along with CutData
option.
<syncfusion:SfDataGrid x:Name="dataGrid"
SelectionUnit="Row"
SelectionMode="Single"
GridCopyOption="CutData,IncludeHeaders"
ItemsSource="{Binding Orders}"/>
this.dataGrid.GridCopyOption = GridCopyOption.CutData | GridCopyOption.IncludeHeaders;
NOTE
IncludeHiddenColumn
is not supported whenSelectionUnit
isCell
.
Events
GridCopyContent
GridCopyContent event occurs when copy/cut the cells in SfDataGrid. GridCopyPasteEventArgs provides information for GridCopyContent
event. You can cancel copy operation by handling this event.
this.dataGrid.GridCopyContent += DataGrid_GridCopyContent;
private void DataGrid_GridCopyContent(object sender, GridCopyPasteEventArgs e)
{
}
GridPasteContent
GridPasteContent event occurs when paste the clipboard value into SfDataGrid. GridCopyPasteEventArgs provides information for GridPasteContent
event. You can cancel paste operation by handling this event.
this.dataGrid.GridPasteContent += DataGrid_GridPasteContent;
private void DataGrid_GridPasteContent(object sender, GridCopyPasteEventArgs e)
{
if (((e.OriginalSender as SfDataGrid).SelectedItem as OrderInfo).OrderID == 1004)
e.Handled = true;
}
CopyGridCellContent
CopyGridCellContent event occurs when cell being copy/cut. GridCopyPasteCellEventArgs provides information for CopyGridCellContent
event, which has following members,
ClipBoardValue – Returns cell value.
Column – Returns corresponding GridColumn of a cell.
RowData – Returns corresponding RowData of a cell.
OriginalSender – Returns the SfDataGrid.
You can change the text copied to clipboard by changing the ClipBoardValue
.
this.dataGrid.CopyGridCellContent += DataGrid_CopyGridCellContent;
private void DataGrid_CopyGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
}
The below code example change the clipboard value as 100 instead of cell value 1003 in SfDataGrid.
this.dataGrid.CopyGridCellContent += DataGrid_CopyGridCellContent;
private void DataGrid_CopyGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
if (e.Column.MappingName == "OrderID" && (e.RowData as OrderInfo).OrderID == 1003)
e.ClipBoardValue = 100;
}
The below code example handled the copy operation when MappingName
of a Column is Country.
this.dataGrid.CopyGridCellContent += DataGrid_CopyGridCellContent;
private void DataGrid_CopyGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
if (e.Column.MappingName == "Country")
e.Handled = true;
}
PasteGridCellContent
PasteGridCellContent event occurs when cell being paste. GridCopyPasteCellEventArgs provides information for PasteGridCellContent
event, which has following members
ClipBoardValue - Returns clipboard value of a particular cell.
Column – Returns corresponding GridColumn of a cell.
RowData – Returns corresponding RowData of a cell.
OriginalSender – Returns the SfDataGrid.
You can change the text paste to SfDataGrid by changing the ClipBoardValue
.
this.dataGrid.PasteGridCellContent += DataGrid_PasteGridCellContent;
private void DataGrid_PasteGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
}
The below code example change the clipboard value as Test instead of clipboard value BOLID.
this.dataGrid.PasteGridCellContent += DataGrid_PasteGridCellContent;
private void DataGrid_PasteGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
if (e.Column.MappingName == "CustomerID" && (e.RowData as OrderInfo).CustomerID == "BERGS")
e.ClipBoardValue = "Test";
}
The below code example handled the paste operation when MappingName of Column is OrderID
this.dataGrid.PasteGridCellContent += DataGrid_PasteGridCellContent;
private void DataGrid_PasteGridCellContent(object sender, GridCopyPasteCellEventArgs e)
{
if (e.Column.MappingName == "OrderID")
e.Handled = true;
}
Handling Programmatically
Copy programmatically
Copy the selected records/cells in SfDataGrid by using Copy method in GridCopyPaste of SfDataGrid.
this.dataGrid.GridCopyPaste.Copy();
Copy a record by selecting the record using MoveCurrentCell method and Copy method in GridCopyPaste of SfDataGrid.
RowColumnIndex rowColumnIndex = new RowColumnIndex();
rowColumnIndex.RowIndex = 2;
rowColumnIndex.ColumnIndex = 2;
this.dataGrid.SelectionController.MoveCurrentCell(rowColumnIndex);
this.dataGrid.GridCopyPaste.Copy();
Copy the multiple records by selecting group of records using SelectRows
method and Copy method in GridCopyPaste of SfDataGrid.
this.dataGrid.SelectionController.SelectRows(1, 7);
this.dataGrid.GridCopyPaste.Copy();
Copy the multiple cells by selecting group of cells using SelectCells
method and Copy
method in GridCopyPaste
of SfDataGrid.
using Syncfusion.UI.Xaml.Grid.Helpers;
this.dataGrid.SelectCells(this.dataGrid.GetRowGenerator().Items[2].RowData, this.dataGrid.Columns[1], this.dataGrid.GetRowGenerator().Items[5].RowData, this.dataGrid.Columns[3]);
this.dataGrid.GridCopyPaste.Copy();
Copy rows without selecting
You can copy the records without selection by using CopyRowsToClipboard method in GridCopyPaste
of SfDataGrid.
this.dataGrid.GridCopyPaste.CopyRowsToClipboard(2, 4);
Cut Programmatically
Cut the selected records/cells in SfDataGrid by using Cut method in GridCopyPaste
of SfDataGrid.
this.dataGrid.GridCopyPaste.Cut();
Cut the entire record in SfDataGrid by selecting whole SfDataGrid using SelectAll method and Cut
method in GridCopyPaste
of SfDataGrid.
this.dataGrid.SelectionController.SelectAll();
this.dataGrid.GridCopyPaste.Cut();
Cut the entire column in SfDataGrid by using SelectCells method and Cut
method in GridCopyPaste
of SfDataGrid.
using Syncfusion.UI.Xaml.Grid.Helpers;
var firstRowdata = this.dataGrid.GetRecordAtRowIndex(dataGrid.GetFirstRowIndex());
var lastRowdata = this.dataGrid.GetRecordAtRowIndex(dataGrid.GetLastRowIndex());
this.dataGrid.SelectCells(firstRowdata, this.dataGrid.Columns[2], lastRowdata, this.dataGrid.Columns[2]);
this.dataGrid.GridCopyPaste.Cut();
Paste programmatically
Paste the clipboard value into SfDataGrid by using Paste method in GridCopyPaste
of SfDataGrid.
this.dataGrid.GridCopyPaste.Paste();
Paste the clipboard value into selected record by selecting the record using MoveCurrentCell method and Paste
method in GridCopyPaste
of SfDataGrid.
RowColumnIndex rowColumnIndex = new RowColumnIndex();
rowColumnIndex.RowIndex = 1;
rowColumnIndex.ColumnIndex = 1;
this.dataGrid.SelectionController.MoveCurrentCell(rowColumnIndex);
this.dataGrid.GridCopyPaste.Paste();
Customizing Copy Paste behavior
SfDataGrid process the clipboard operations in GridCutCopyPaste class. You can customize the default copy paste behaviors by overriding GridCutCopyPaste
class and set it to SfDataGrid.GridCopyPaste
.
public class CustomCopyPaste : GridCutCopyPaste
{
public CustomCopyPaste(SfDataGrid sfGrid) : base(sfGrid)
{
}
}
public MainWindow()
{
InitializeComponent();
this.dataGrid.GridCopyPaste = new CustomCopyPaste(this.dataGrid);
}
Paste a cell into many cells
By default, you can copy one cell and paste it into another cell when Cell Selection is enabled in SfDataGrid. The below code shows how to copy one cell and paste it into all the selected cells by overriding PasteToCell method in GridCutCopyPaste class.
using Syncfusion.UI.Xaml.Grid;
public class CustomCopyPaste: GridCutCopyPaste
{
public CustomCopyPaste(SfDataGrid dataGrid) : base(dataGrid)
{
}
async protected override void PasteToCell(object record, GridColumn column, object rowData)
{
DataPackageView dataPackageView = Clipboard.GetContent();
String text = null;
if (dataPackageView.Contains(StandardDataFormats.Text))
text = await dataPackageView.GetTextAsync();
string[] clipBoardText = Regex.Split(text, @"\r\n");
clipBoardText = Regex.Split(clipBoardText[0], @"\t");
//Gets the clipBoardText and checks whether the clipBoardText is more than one cell or not
//Calls the base.
if (clipBoardText.Count() > 1)
{
base.PasteToCell(record, column, rowData);
return;
}
//Gets the selectedCells for paste the copied cell
var selectedCells = this.dataGrid.GetSelectedCells();
int selectedCellsCount = selectedCells.Count;
for (int i = 0; i < selectedCellsCount; i++)
{
record = selectedCells[i].RowData;
column = selectedCells[i].Column;
//Calls the PasteToCell method with particular record of selectedCells,
// Column of selected records and rowData
base.PasteToCell(record, column, rowData);
}
}
}
Paste a record into many rows
By default, you can able to copy one row and paste it into another row when Row Selection is enabled in SfDataGrid. The below code shows how to copy one row and paste it into all selected rows by overriding the PasteToRow method in the GridCutCopyPaste
class.
public class CustomCopyPaste : GridCutCopyPaste
{
public CustomCopyPaste(SfDataGrid dataGrid) : base(dataGrid)
{
}
async protected override void PasteToRow(object copiedRecord, object selectedRecords)
{
DataPackageView dataPackageView = Clipboard.GetContent();
String text = null;
if (dataPackageView.Contains(StandardDataFormats.Text))
text = await dataPackageView.GetTextAsync();
string[] clipBoardText = Regex.Split(text, @"\r\n");
//Gets the clipBoardText and checks whether the clipBoardText is more than one row or not
//Calls the base.
if (clipBoardText.Count() > 1)
{
base.PasteToRow(copiedRecord, selectedRecords);
return;
}
var selectedRecord = this.dataGrid.SelectedItems;
for (int i = 0; i < selectedRecord.Count; i++)
{
//Gets the Selected records for paste the copied row.
selectedRecords = selectedRecord[i];
// Calls the PasteToRow method with copiedRecord and selectedRecord
base.PasteToRow(copiedRecord, selectedRecords);
}
}
}
Select pasted records
By default, after pasting the clipboard value to SfDataGrid selection is maintains in previously selected records as it is. The below code shows select the pasted records after the Paste operation, by overriding the PasteToRows and PasteToRow methods in GridCutCopyPaste class. This code is applicable when SelectionUnit is Row
.
public class CustomCopyPaste : GridCutCopyPaste
{
public CustomCopyPaste(SfDataGrid dataGrid) : base(dataGrid)
{
}
//Creates the new list for add the selected records
public List<object> selectedItem = new List<object>();
protected override void PasteToRows(object clipBoardRows)
{
base.PasteToRows(clipBoardRows);
//Uses the SelectionController to apply the selection for Pasted records
this.dataGrid.SelectionController.HandleGridOperations(new GridOperationsHandlerArgs(GridOperation.Paste, selectedItem));
}
protected override void PasteToRow(object clipBoardContent, object selectedRecords)
{
//Adds the selected record to list
selectedItem.Add(selectedRecords);
base.PasteToRow(clipBoardContent, selectedRecords);
}
}
Create new records while pasting
By default, while paste the clipboard value to SfDataGrid, it changes the values of the already existing records. The below code example shows how to add the copied records as new rows in SfDataGrid by overriding the PasteToRows
method in GridCutCopyPaste
class.
public class CustomCopyPaste : GridCutCopyPaste
{
public CustomCopyPaste(SfDataGrid dataGrid) : base(dataGrid)
{
}
//Creates the new list for add the selected records
public List<object> selectedItem = new List<object>();
protected override void PasteToRows(object clipBoardRows)
{
var copiedRecord = (string[])clipBoardRows;
int copiedRecordsCount = copiedRecord.Count();
//Based on the clipboard count, the new record for paste is added
if (copiedRecordsCount > 0)
{
//Gets the viewModel for adding the record
var rec = this.dataGrid.DataContext as ViewModel;
for (int i = 0; i < copiedRecordsCount; i++)
{
//Creates the new instance for Model, for adding the new record
OrderInfo entity = new OrderInfo();
for (int j = 0; j < this.dataGrid.Columns.Count; j++)
{
var record = copiedRecord[i];
string[] recd = Regex.Split(record, @"\t");
//Adds the new record by using PasteToCell method by passing the created data, particular column, and clipboard value
this.PasteToCell(entity, this.dataGrid.Columns[j], recd[j]);
}
//Adds the pasted record in collection
rec.Orders.Add(entity);
}
}
}
}