When testing an application with Syncfusion GridControl, you may need to copy or paste grid data to and from the clipboard. For example, you can use this to specify the same values in multiple cells or organize a data exchange between the tested application and another one. With TestComplete, you can directly access the clipboard contents using the Sys.Clipboard property. This way, you can get the text copied to the clipboard as well as set the clipboard contents in order to paste it to the application under test.
This topic describes the two approaches that you can use to copy and paste GridControl data from scripts; simulating the corresponding user actions over the grid control and using the grid’s internal properties and methods. In your scripts, you can use the approach that better suits your needs. Depending on the approach you choose, you may need to locate the desired cell in the grid and select it in order to be able to copy or paste the cell value. For more information on how you can obtain and modify grid data, see Obtaining and Setting Cell Values in Syncfusion GridControl.
![]()  | 
To perform these actions, TestComplete should have access to internal objects, properties and methods of the GridControl object. For this purpose, the .NET Application Support plugin must be installed and enabled. When testing Syncfusion GridControl controls, use specific methods and properties of the corresponding   | 
Simulating User Actions Over the GridControl
You can copy the cell value to the clipboard or paste it from the clipboard using the Ctrl+C and Ctrl+V keyboard shortcuts. You can simulate these shortcuts using the Keys action applied to the grid control.
Before performing the copy or paste operation, you need to locate the desired cell in the grid, select it and activate its in-place editor. After the cell’s edit mode is activated, you should specify the cell contents to be copied or replaced. For example, to select the entire cell value, you can simulate the successive Home and Shift+End key presses (Home moves the caret to the beginning of the cell text and Shift+End selects the cell text from the caret position to the end). After performing the pasting operation, you should apply the changes by simulating the Enter keypress.
| Note: | The grid control may be configured so that it selects the cell contents right after the cell becomes selected. For example, this happens if the grid’s ActivateCurrentCellBehavior property is set to “SelectAll”. In this case, you do not need to perform any actions to select the cell text to be copied or replaced. | 
Below in an example that illustrates how you can copy the GridControl cells' values to and paste them from the clipboard.
Example
JavaScript, JScript
function Main ()
{
  var p, Grid, i;
  // Obtain the application process and the grid object
  p = Sys.Process("UndoRedoSample");
  Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1");
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ("Copied value: " + Sys.Clipboard); 
  for (i=2; i<=9; i++)
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000";
  PasteCellValue (Grid, 10, 1);
}
function CopyCellValue (Grid, RowIndex, ColIndex)
{
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Select the cell contents and copy it to the clipboard
  Grid.Keys ("[Home]![End]^c");
  // Close the cell's editor
  CancelEdit (Grid);
}
function PasteCellValue (Grid, RowIndex, ColIndex)
{
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Replace the cell value with the clipboard contents 
  Grid.Keys ("[Home]![End]^v");
  // Save the changes
  CloseCellEditor (Grid);
}
function ClickCell (Grid, RowIndex, ColIndex)
{
  // Make cell visible
  Grid.ScrollCellInView_3 (RowIndex, ColIndex);
  // Get the cell coordinates
  var rect = Grid.RangeInfoToRectangle (Grid.GridCellsRange.Cell(RowIndex, ColIndex));
  Grid.Click (rect.X + rect.Width/2, rect.Y + rect.Height/2);
}
function ActivateCellEditor (Grid)
{
  if (!Grid.CurrentCell.IsEditing)
    Grid.Keys ("[F2]")
}
function CloseCellEditor (Grid)
{
  Grid.Keys ("[Enter]");
}
function CancelEdit (Grid)
{
  Grid.Keys ("[Esc]");
}
Python
def Main ():
  # Obtain the application process and the grid object
  p = Sys.Process("UndoRedoSample");
  Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1");
  # Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ("Copied value: " + Sys.Clipboard); 
  for i in range(2, 9):
    PasteCellValue (Grid, i, 1);
  # Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000";
  PasteCellValue (Grid, 10, 1);
def CopyCellValue (Grid, RowIndex, ColIndex):
  # Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  # Select the cell contents and copy it to the clipboard
  Grid.Keys ("[Home]![End]^c");
  # Close the cell's editor
  CancelEdit (Grid);
def PasteCellValue (Grid, RowIndex, ColIndex):
  # Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  # Replace the cell value with the clipboard contents 
  Grid.Keys ("[Home]![End]^v");
  # Save the changes
  CloseCellEditor (Grid);
def ClickCell (Grid, RowIndex, ColIndex):
  # Make cell visible
  Grid.ScrollCellInView_3 (RowIndex, ColIndex);
  # Get the cell coordinates
  rect = Grid.RangeInfoToRectangle (Grid.GridCellsRange.Cell(RowIndex, ColIndex));
  Grid.Click (rect.X + rect.Width/2, rect.Y + rect.Height/2);
def ActivateCellEditor (Grid):
  if not Grid.CurrentCell.IsEditing:
    Grid.Keys ("[F2]")
def CloseCellEditor (Grid):
  Grid.Keys ("[Enter]");
def CancelEdit (Grid):
  Grid.Keys ("[Esc]");
VBScript
Sub Main
  Dim p, Grid, i
  ' Obtain the application process and the grid object
  Set p = Sys.Process("UndoRedoSample")
  Set Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1")
  ' Copy the cell value and paste it to other cells
  Call CopyCellValue (Grid, 1, 1)
  Call Log.Message ("Copied value: " & Sys.Clipboard) 
  For i = 2 To 9
    Call PasteCellValue (Grid, i, 1)
  Next
  ' Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000"
  Call PasteCellValue (Grid, 10, 1)
End Sub
Sub CopyCellValue (Grid, RowIndex, ColIndex)
  ' Select the cell and activate its in-place editor
  Call ClickCell (Grid, RowIndex, ColIndex)
  Call ActivateCellEditor (Grid)
  ' Select the cell contents and copy it to the clipboard
  Call Grid.Keys ("[Home]![End]^c")
  ' Close the cell's editor
  Call CancelEdit (Grid)
End Sub
Sub PasteCellValue (Grid, RowIndex, ColIndex)
  ' Select the cell and activate its in-place editor
  Call ClickCell (Grid, RowIndex, ColIndex)
  Call ActivateCellEditor (Grid)
  ' Replace the cell value with the clipboard contents 
  Call Grid.Keys ("[Home]![End]^v")
  ' Save the changes
  Call CloseCellEditor (Grid)
End Sub
Sub ClickCell (Grid, RowIndex, ColIndex)
  Dim rect
  ' Make cell visible
  Call Grid.ScrollCellInView_3 (RowIndex, ColIndex)
  ' Get the cell coordinates
  Set rect = Grid.RangeInfoToRectangle (Grid.GridCellsRange.Cell(RowIndex, ColIndex))
  Call Grid.Click (rect.X + rect.Width/2, rect.Y + rect.Height/2)
End Sub
Sub ActivateCellEditor (Grid)
  If Not Grid.CurrentCell.IsEditing Then
    Call Grid.Keys ("[F2]")
  End If
End Sub
Sub CloseCellEditor (Grid)
  Call Grid.Keys ("[Enter]")
End Sub
Sub CancelEdit (Grid)
  Call Grid.Keys ("[Esc]")
End Sub
DelphiScript
procedure CopyCellValue (Grid, RowIndex, ColIndex); forward;
procedure PasteCellValue (Grid, RowIndex, ColIndex); forward;
procedure ClickCell (Grid, RowIndex, ColIndex); forward;
procedure ActivateCellEditor (Grid); forward;
procedure CloseCellEditor (Grid); forward;
procedure CancelEdit (Grid); forward;
procedure Main;
var p, Grid, i : OleVariant;
begin
  // Obtain the application process and the grid object
  p := Sys.Process('UndoRedoSample');
  Grid := p.WinFormsObject('Form1').WinFormsObject('panel1').WinFormsObject('gridControl1');
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ('Copied value: ' + Sys.Clipboard); 
  for i:=2 to 9 do
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard := '5000';
  PasteCellValue (Grid, 10, 1);
end;
procedure CopyCellValue (Grid, RowIndex, ColIndex);
begin
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Select the cell contents and copy it to the clipboard
  Grid.Keys ('[Home]![End]^c');
  // Close the cell's editor
  CancelEdit (Grid);
end;
procedure PasteCellValue (Grid, RowIndex, ColIndex);
begin
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Replace the cell value with the clipboard contents 
  Grid.Keys ('[Home]![End]^v');
  // Save the changes
  CloseCellEditor (Grid);
end;
procedure ClickCell (Grid, RowIndex, ColIndex);
var rect : OleVariant;
begin
  // Make cell visible
  Grid.ScrollCellInView_3 (RowIndex, ColIndex);
  // Get the cell coordinates
  rect := Grid.RangeInfoToRectangle (Grid.GridCellsRange.Cell(RowIndex, ColIndex));
  Grid.Click (rect.X + rect.Width/2, rect.Y + rect.Height/2);
end;
procedure ActivateCellEditor (Grid);
begin
  if not Grid.CurrentCell.IsEditing then
    Grid.Keys ('[F2]')
end;
procedure CloseCellEditor (Grid);
begin
  Grid.Keys ('[Enter]');
end;
procedure CancelEdit (Grid);
begin
  Grid.Keys ('[Esc]');
end;
C++Script, C#Script
function Main ()
{
  var p, Grid, i;
  // Obtain the application process and the grid object
  p = Sys.Process("UndoRedoSample");
  Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1");
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log["Message"]("Copied value: " + Sys["Clipboard"]); 
  for (i=2; i<=9; i++)
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys["Clipboard"] = "5000";
  PasteCellValue (Grid, 10, 1);
}
function CopyCellValue (Grid, RowIndex, ColIndex)
{
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Select the cell contents and copy it to the clipboard
  Grid["Keys"]("[Home]![End]^c");
  // Close the cell's editor
  CancelEdit (Grid);
}
function PasteCellValue (Grid, RowIndex, ColIndex)
{
  // Select the cell and activate its in-place editor
  ClickCell (Grid, RowIndex, ColIndex);
  ActivateCellEditor (Grid);
  // Replace the cell value with the clipboard contents 
  Grid["Keys"]("[Home]![End]^v");
  // Save the changes
  CloseCellEditor (Grid);
}
function ClickCell (Grid, RowIndex, ColIndex)
{
  // Make cell visible
  Grid["ScrollCellInView_3"](RowIndex, ColIndex);
  // Get the cell coordinates
  var rect = Grid["RangeInfoToRectangle"](Grid["GridCellsRange"]["Cell"](RowIndex, ColIndex));
  Grid["Click"](rect["X"] + rect["Width"]/2, rect["Y"] + rect["Height"]/2);
}
function ActivateCellEditor (Grid)
{
  if (! Grid["CurrentCell"]["IsEditing"])
    Grid["Keys"]("[F2]")
}
function CloseCellEditor (Grid)
{
  Grid["Keys"]("[Enter]");
}
function CancelEdit (Grid)
{
  Grid["Keys"]("[Esc]");
}
GridControl may also have a context menu allowing the users to copy or paste grid cell values, so you may want to perform clipboard operations using this menu. To call the context menu, you can use the ClickR action applied to the grid control, or send the Application key press to the grid control using the Keys action. After the context menu is displayed on the screen, you can obtain it using the PopupMenu property added to the GridControl by TestComplete. To select items in the context menu, use the Click or Select method of the resulting Menu object.
Using the GridControl Internal Methods
It is possible to copy and paste GridControl cell values by using the grid control's internal methods. The grid’s Model.CutPaste property provides access to the special GridModelCutPaste object that lets you perform various clipboard operations with the grid data. For example, to copy the selected cell’s value to the clipboard and paste it from the clipboard, you can use the following statements:
GridObj.Model.CutPaste.Copy()
GridObj.Model.CutPaste.Paste()
Note that these methods only work with the currently selected cell. To be able to copy or paste the cell value you need to locate the cell in the grid and select it.
The example below demonstrates how you can copy and paste cell data via the GridControl.Model.CutPaste object in scripts:
Example
JavaScript, JScript
function Main ()
{
  var p, Grid, i;
  // Obtain the application process and the grid object
  p = Sys.Process("UndoRedoSample");
  Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1");
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ("Copied value: " + Sys.Clipboard); 
  for (i=2; i<=9; i++)
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000";
  PasteCellValue (Grid, 10, 1);
}
function CopyCellValue (Grid, RowIndex, ColIndex)
{
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Copy();
}
function PasteCellValue (Grid, RowIndex, ColIndex)
{
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Paste();
}
function SelectCell (Grid, RowIndex, ColIndex)
{
  // Try to navigate to the specified cell
  if (Grid.CurrentCell.MoveTo_3 (RowIndex, ColIndex))
    // Make the selected cell visible
    Grid.CurrentCell.ScrollInView()
  else
    Log.Error ("Cell (" + RowIndex + ", " + ColIndex + ") could not be selected.");
}
Python
def Main ():
  # Obtain the application process and the grid object
  p = Sys.Process("UndoRedoSample");
  Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1");
  # Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ("Copied value: " + Sys.Clipboard); 
  for i in range(2, 9):
    PasteCellValue (Grid, i, 1);
  # Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000";
  PasteCellValue (Grid, 10, 1);
def CopyCellValue (Grid, RowIndex, ColIndex):
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Copy();
def PasteCellValue (Grid, RowIndex, ColIndex):
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Paste();
def SelectCell (Grid, RowIndex, ColIndex):
  # Try to navigate to the specified cell
  if (Grid.CurrentCell.MoveTo_3 (RowIndex, ColIndex)):
    # Make the selected cell visible
    Grid.CurrentCell.ScrollInView()
  else:
    Log.Error ("Cell (" + RowIndex + ", " + ColIndex + ") could not be selected.");
VBScript
Sub Main
  Dim p, Grid, i
  ' Obtain the application process and the grid object
  Set p = Sys.Process("UndoRedoSample")
  Set Grid = p.WinFormsObject("Form1").WinFormsObject("panel1").WinFormsObject("gridControl1")
  ' Copy the cell value and paste it to other cells
  Call CopyCellValue (Grid, 1, 1)
  Call Log.Message ("Copied value: " & Sys.Clipboard) 
  For i = 2 To 9
    Call PasteCellValue (Grid, i, 1)
  Next
  ' Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard = "5000"
  Call PasteCellValue (Grid, 10, 1)
End Sub
Sub CopyCellValue (Grid, RowIndex, ColIndex)
  Call SelectCell (Grid, RowIndex, ColIndex)
  Grid.Model.CutPaste.Copy
End Sub
Sub PasteCellValue (Grid, RowIndex, ColIndex)
  Call SelectCell (Grid, RowIndex, ColIndex)
  Grid.Model.CutPaste.Paste
End Sub
Sub SelectCell (Grid, RowIndex, ColIndex)
  ' Try to navigate to the specified cell
  If Grid.CurrentCell.MoveTo_3 (RowIndex, ColIndex) Then
    ' Make the selected cell visible
    Grid.CurrentCell.ScrollInView
  Else
    Call Log.Error ("Cell (" & RowIndex & ", " & ColIndex & ") could not be selected.")
  End If
End Sub
DelphiScript
procedure CopyCellValue (Grid, RowIndex, ColIndex); forward;
procedure PasteCellValue (Grid, RowIndex, ColIndex); forward;
procedure SelectCell (Grid, RowIndex, ColIndex); forward;
procedure Main;
var p, Grid, i : OleVariant;
begin
  // Obtain the application process and the grid object
  p := Sys.Process('UndoRedoSample');
  Grid := p.WinFormsObject('Form1').WinFormsObject('panel1').WinFormsObject('gridControl1');
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log.Message ('Copied value: ' + Sys.Clipboard); 
  for i:=2 to 9 do
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys.Clipboard := '5000';
  PasteCellValue (Grid, 10, 1);
end;
procedure CopyCellValue (Grid, RowIndex, ColIndex);
begin
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Copy;
end;
procedure PasteCellValue (Grid, RowIndex, ColIndex);
begin
  SelectCell (Grid, RowIndex, ColIndex);
  Grid.Model.CutPaste.Paste;
end;
procedure SelectCell (Grid, RowIndex, ColIndex);
begin
  // Try to navigate to the specified cell
  if Grid.CurrentCell.MoveTo_3 (RowIndex, ColIndex) then
    // Make the selected cell visible
    Grid.CurrentCell.ScrollInView
  else
    Log.Error ('Cell (' + aqConvert.VarToStr(RowIndex) + ', ' + aqConvert.VarToStr(ColIndex) + ') could not be selected.');
end;
C++Script, C#Script
function Main ()
{
  var p, Grid, i;
  // Obtain the application process and the grid object
  p = Sys["Process"]("UndoRedoSample");
  Grid = p["WinFormsObject"]("Form1")["WinFormsObject"]("panel1")["WinFormsObject"]("gridControl1");
  // Copy the cell value and paste it to other cells
  CopyCellValue (Grid, 1, 1);
  Log["Message"]("Copied value: " + Sys["Clipboard"]); 
  for (i=2; i<=9; i++)
    PasteCellValue (Grid, i, 1);
  // Set the clipboard contents directly and paste it into the cell
  Sys["Clipboard"] = "5000";
  PasteCellValue (Grid, 10, 1);
}
function CopyCellValue (Grid, RowIndex, ColIndex)
{
  SelectCell (Grid, RowIndex, ColIndex);
  Grid["Model"]["CutPaste"]["Copy"]();
}
function PasteCellValue (Grid, RowIndex, ColIndex)
{
  SelectCell (Grid, RowIndex, ColIndex);
  Grid["Model"]["CutPaste"]["Paste"]();
}
function SelectCell (Grid, RowIndex, ColIndex)
{
  // Try to navigate to the specified cell
  if (Grid["CurrentCell"]["MoveTo_3"](RowIndex, ColIndex))
    // Make the selected cell visible
    Grid["CurrentCell"]["ScrollInView"]()
  else
    Log["Error"]("Cell (" + RowIndex + ", " + ColIndex + ") could not be selected.");
}
See Also
Working With Syncfusion GridControl
Selecting Cells in Syncfusion GridControl
Activating and Closing In-place Editors in Syncfusion GridControl
Obtaining and Setting Cell Values in Syncfusion GridControl

Simulating User Actions Over the GridControl
View description