When testing an application with the DataGridView control, you may need to copy or paste grid data to and from the clipboard. For example, you can use this to organize a data exchange between the tested application and another one. In addition, the DataGridView control lets you copy the contents of the selected records to the clipboard, so you may use this to export the selected data. 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.
To perform these actions, TestComplete should have access to internal objects, properties and methods of the DataGridView control. For this purpose, the .NET Application Support and Microsoft Control Support plugins must be installed and enabled. When testing Microsoft DataGridView controls, use specific methods and properties of the corresponding |
Copying and Pasting Individual Cell Values
When editing grid data, you may need to specify the same values in multiple cells. You can do this by copying a value of a particular cell and pasting it to the desired cells. At that, you can also directly access the clipboard contents via the Sys.Clipboard
property and use it as you wish.
Before copying or pasting the cell value, you need to locate the needed 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 Ctrl+A shortcut.
To copy the selection to the clipboard or paste it from the clipboard, you can either simulate the Ctrl+C and Ctrl+V keyboard shortcuts, or select the Copy or Paste command from the cell’s context menu. To simulate the shortcuts, use the Keys
action applied to the grid control. To work with the popup menu you can also use the corresponding shortcuts -- the Application keypress will invoke the menu, the c keypress will select the Copy command and pressing p will select the Paste command (c and p are the hot keys for the context menu’s Copy and Paste items).
Note that after you have pasted the value into the cell, you should simulate the Enter keypress to apply the changes.
Below in an example that illustrates how you can copy DataGridView cell values to and paste them from the clipboard.
Example
JavaScript, JScript
function Main ()
{
var p, Grid, i;
// Obtain the grid object
p = Sys.Process ("DataGridViewSample");
Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1");
// Copy the cell value to the clipboard
CopyCellValue (Grid, 0, "Product");
Log.Message ("Copied value: " + Sys.Clipboard);
// Paste the copied value to other cells
for (i=1; i<6; i++)
PasteCellValue (Grid, i, "Product");
}
// Copies the cell value to the clipboard
function CopyCellValue (Grid, RowIndex, ColumnId)
{
// Select the cell
Grid.ClickCell (RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and copy it to the clipboard
Grid.Keys ("^a^c");
CancelEditing (Grid);
}
// Copies the cell value from the clipboard
function PasteCellValue (Grid, RowIndex, ColumnId)
{
// Select the cell
Grid.ClickCell (RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and paste the new value from the clipboard
Grid.Keys ("^a^v");
// Save the changes made
CloseCellEditor (Grid);
}
function ActivateCellEditor (Grid)
{
Grid.Keys ("[F2]");
}
function CloseCellEditor (Grid)
{
Grid.Keys ("[Enter]");
}
function CancelEditing (Grid)
{
Grid.Keys ("[Esc]");
}
Python
def Main ():
# Obtain the grid object
p = Sys.Process ("DataGridViewSample")
Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1")
# Copy the cell value to the clipboard
CopyCellValue (Grid, 0, "Product")
Log.Message ("Copied value: " + Sys.Clipboard)
# Paste the copied value to other cells
for i in range(1, 6):
PasteCellValue (Grid, i, "Product")
# Copies the cell value to the clipboard
def CopyCellValue (Grid, RowIndex, ColumnId):
# Select the cell
Grid.ClickCell (RowIndex, ColumnId)
# Activate the edit mode
ActivateCellEditor (Grid)
# Select the cell contents and copy it to the clipboard
Grid.Keys ("^a^c")
CancelEditing (Grid)
# Copies the cell value from the clipboard
def PasteCellValue (Grid, RowIndex, ColumnId):
# Select the cell
Grid.ClickCell (RowIndex, ColumnId)
# Activate the edit mode
ActivateCellEditor (Grid)
# Select the cell contents and paste the new value from the clipboard
Grid.Keys ("^a^v")
# Save the changes made
CloseCellEditor (Grid)
def ActivateCellEditor (Grid):
Grid.Keys ("[F2]")
def CloseCellEditor (Grid):
Grid.Keys ("[Enter]")
def CancelEditing (Grid):
Grid.Keys ("[Esc]")
VBScript
Sub Main
Dim p, Grid, i
' Obtain the grid object
Set p = Sys.Process ("DataGridViewSample")
Set Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1")
' Copy the cell value to the clipboard
Call CopyCellValue (Grid, 0, "Product")
Call Log.Message ("Copied value: " & Sys.Clipboard)
' Paste the copied value to other cells
For i=1 To 5
Call PasteCellValue (Grid, i, "Product")
Next
End Sub
' Copies the cell value to the clipboard
Sub CopyCellValue (Grid, RowIndex, ColumnId)
' Select the cell
Call Grid.ClickCell (RowIndex, ColumnId)
' Activate the edit mode
Call ActivateCellEditor (Grid)
' Select the cell contents and copy it to the clipboard
Call Grid.Keys ("^a^c")
Call CancelEditing (Grid)
End Sub
' Copies the cell value from the clipboard
Sub PasteCellValue (Grid, RowIndex, ColumnId)
' Select the cell
Call Grid.ClickCell (RowIndex, ColumnId)
' Activate the edit mode
Call ActivateCellEditor (Grid)
' Select the cell contents and paste the new value from the clipboard
Call Grid.Keys ("^a^v")
' Save the changes made
Call CloseCellEditor (Grid)
End Sub
Sub ActivateCellEditor (Grid)
Grid.Keys "[F2]"
End Sub
Sub CloseCellEditor (Grid)
Grid.Keys "[Enter]"
End Sub
Sub CancelEditing (Grid)
Grid.Keys "[Esc]"
End Sub
DelphiScript
procedure CopyCellValue (Grid, RowIndex, ColumnId); forward;
procedure PasteCellValue (Grid, RowIndex, ColumnId); forward;
procedure ActivateCellEditor (Grid); forward;
procedure CloseCellEditor (Grid); forward;
procedure CancelEditing (Grid); forward;
procedure Main;
var p, Grid, i : OleVariant;
begin
// Obtain the grid object
p := Sys.Process ('DataGridViewSample');
Grid := p.WinFormsObject('Form1').WinFormsObject('dataGridView1');
// Copy the cell value to the clipboard
CopyCellValue (Grid, 0, 'Product');
Log.Message ('Copied value: ' + Sys.Clipboard);
// Paste the copied value to other cells
for i:=1 to 5 do
PasteCellValue (Grid, i, 'Product');
end;
// Copies the cell value to the clipboard
procedure CopyCellValue (Grid, RowIndex, ColumnId);
begin
// Select the cell
Grid.ClickCell (RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and copy it to the clipboard
Grid.Keys ('^a^c');
CancelEditing (Grid);
end;
// Copies the cell value from the clipboard
procedure PasteCellValue (Grid, RowIndex, ColumnId);
begin
// Select the cell
Grid.ClickCell (RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and paste the new value from the clipboard
Grid.Keys ('^a^v');
// Save the changes made
CloseCellEditor (Grid);
end;
procedure ActivateCellEditor (Grid);
begin
Grid.Keys ('[F2]');
end;
procedure CloseCellEditor (Grid);
begin
Grid.Keys ('[Enter]');
end;
procedure CancelEditing (Grid);
begin
Grid.Keys ('[Esc]');
end;
C++Script, C#Script
function Main ()
{
var p, Grid, i;
// Obtain the grid object
p = Sys["Process"]("DataGridViewSample");
Grid = p["WinFormsObject"]("Form1")["WinFormsObject"]("dataGridView1");
// Copy the cell value to the clipboard
CopyCellValue (Grid, 0, "Product");
Log["Message"]("Copied value: " + Sys["Clipboard"]);
// Paste the copied value to other cells
for (i=1; i<6; i++)
PasteCellValue (Grid, i, "Product");
}
// Copies the cell value to the clipboard
function CopyCellValue (Grid, RowIndex, ColumnId)
{
// Select the cell
Grid["ClickCell"](RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and copy it to the clipboard
Grid["Keys"]("^a^c");
CancelEditing (Grid);
}
// Copies the cell value from the clipboard
function PasteCellValue (Grid, RowIndex, ColumnId)
{
// Select the cell
Grid["ClickCell"](RowIndex, ColumnId);
// Activate the edit mode
ActivateCellEditor (Grid);
// Select the cell contents and paste the new value from the clipboard
Grid["Keys"]("^a^v");
// Save the changes made
CloseCellEditor (Grid);
}
function ActivateCellEditor (Grid)
{
Grid["Keys"]("[F2]");
}
function CloseCellEditor (Grid)
{
Grid["Keys"]("[Enter]");
}
function CancelEditing (Grid)
{
Grid["Keys"]("[Esc]");
}
Copying Selected Records to the Clipboard
The DataGridView control lets the users copy contents of the selected cells to the clipboard, so that it can be easily used by other applications, such as Notepad, Microsoft Excel or Microsoft Word. The cells contents are copied to the clipboard in different formats: as tab- and comma-delimited text and as an HTML-formatted table. Depending on the grid’s ClipboardCopyMode
property, the copied text may or may not include the row and column headers text:
- If
ClipboardCopyMode
is Disable, the copying feature is disabled. - If
ClipboardCopyMode
is EnableAlwaysIncludeHeaderText, the copied text will include values of selected cells as well as captions of rows and columns that contain selected cells. - If
ClipboardCopyMode
is EnableWithAutoHeaderText, the copied text will include the values of selected cells. The row and column headers will be included in the copied text only if at least one header is selected. - If
ClipboardCopyMode
is EnableWithoutHeaderText, the copied text will include values of the selected cells without row and column headers.
The selected records are copied to the clipboard when the user presses the Ctrl+C shortcut. You can simulate this key combination using the Keys
action.
Example
JavaScript, JScript
function Main ()
{
var p, Grid, CopyModes, OldMode, i, FileName, FileExt;
FileName = "C:\\GridData_"; FileExt = ".txt";
CopyModes = new Array ("Disable", "EnableAlwaysIncludeHeaderText", "EnableWithAutoHeaderText", "EnableWithoutHeaderText");
// Obtain th grid object
p = Sys.Process ("DataGridViewSample");
Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1");
// Select the range of cells in the grid
SelectCellRange (Grid, 1, 1, 6, 5);
// Save the initial ClipboardCopyMode property value
OldMode = Grid.ClipboardCopyMode;
for (i in CopyModes)
{
// Clear the clipboard
Sys.Clipboard = "";
// Set the copy mode
Grid.ClipboardCopyMode = CopyModes[i];
// Copy selected cells to the clipboard
Grid.Keys ("^C");
// Save the clipboard contents to a text file
aqFile.WriteToTextFile (FileName + CopyModes[i] + FileExt, Sys.Clipboard, aqFile.ctANSI, true);
}
// Restore the initial ClipboardCopyMode property value
Grid.ClipboardCopyMode = OldMode;
}
// Selects a range of rows
function SelectRowRange (Grid, StartRowIndex, EndRowIndex)
{
// Select the 1st row of the range
Grid.ClickRowIndicator (StartRowIndex);
// Extend the selection
Grid.ClickRowIndicator (EndRowIndex, skShift);
}
Python
def Main ():
FileName = "C:\\GridData_"
FileExt = ".txt"
CopyModes = list("Disable", "EnableAlwaysIncludeHeaderText", "EnableWithAutoHeaderText", "EnableWithoutHeaderText")
# Obtain th grid object
p = Sys.Process ("DataGridViewSample")
Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1")
# Select the range of cells in the grid
SelectCellRange (Grid, 1, 1, 6, 5)
# Save the initial ClipboardCopyMode property value
OldMode = Grid.ClipboardCopyMode
for i in CopyModes:
# Clear the clipboard
Sys.Clipboard = ""
# Set the copy mode
Grid.ClipboardCopyMode = CopyModes[i]
# Copy selected cells to the clipboard
Grid.Keys ("^C")
# Save the clipboard contents to a text file
aqFile.WriteToTextFile (FileName + CopyModes[i] + FileExt, Sys.Clipboard, aqFile.ctANSI, True)
# Restore the initial ClipboardCopyMode property value
Grid.ClipboardCopyMode = OldMode
# Selects a range of rows
def SelectRowRange (Grid, StartRowIndex, EndRowIndex):
# Select the 1st row of the range
Grid.ClickRowIndicator (StartRowIndex)
# Extend the selection
Grid.ClickRowIndicator (EndRowIndex, skShift)
VBScript
Sub Main
Dim p, Grid, CopyModes, OldMode, Mode, FileName, FileExt
FileName = "C:\GridData_"
FileExt = ".txt"
CopyModes = Array ("Disable", "EnableAlwaysIncludeHeaderText", "EnableWithAutoHeaderText", "EnableWithoutHeaderText")
' Obtain th grid object
Set p = Sys.Process ("DataGridViewSample")
Set Grid = p.WinFormsObject("Form1").WinFormsObject("dataGridView1")
' Select the range of cells in the grid
Call SelectRowRange (Grid, 1, 6)
' Save the initial ClipboardCopyMode property value
OldMode = Grid.ClipboardCopyMode
For Each Mode In CopyModes
' Clear the clipboard
Sys.Clipboard = ""
' Set the copy mode
Grid.ClipboardCopyMode = Mode
' Copy selected records to the clipboard
Call Grid.Keys ("^C")
' Save the clipboard contents to a text file
Call aqFile.WriteToTextFile (FileName & Mode & FileExt, Sys.Clipboard, aqFile.ctANSI, True)
Next
' Restore the initial ClipboardCopyMode property value
Grid.ClipboardCopyMode = OldMode
End Sub
Sub SelectRowRange (Grid, StartRowIndex, EndRowIndex)
' Select the 1st row of the range
Call Grid.ClickRowIndicator (StartRowIndex)
' Extend the selection
Call Grid.ClickRowIndicator (EndRowIndex, skShift)
End Sub
DelphiScript
procedure SelectRowRange (Grid, StartRowIndex, EndRowIndex); forward;
procedure Main;
var
p, Grid, OldMode, i, FileName, FileExt : OleVariant;
CopyModes : array [0..3];
begin
FileName := 'C:\GridData_'; FileExt := '.txt';
CopyModes[0] := 'Disable';
CopyModes[1] := 'EnableAlwaysIncludeHeaderText';
CopyModes[2] := 'EnableWithAutoHeaderText';
CopyModes[3] := 'EnableWithoutHeaderText';
// Obtain th grid object
p := Sys.Process ('DataGridViewSample');
Grid := p.WinFormsObject('Form1').WinFormsObject('dataGridView1');
// Select the range of cells in the grid
SelectRowRange (Grid, 1, 6);
// Save the initial ClipboardCopyMode property value
OldMode := Grid.ClipboardCopyMode;
for i := 0 to 3 do
begin
// Clear the clipboard
Sys.Clipboard := '';
// Set the copy mode
Grid.ClipboardCopyMode := CopyModes[i];
// Copy the selected records to the clipboard
Grid.Keys ('^C');
// Save the clipboard contents to a text file
aqFile.WriteToTextFile (FileName + CopyModes[i] + FileExt, Sys.Clipboard, aqFile.ctANSI, true);
end;
// Restore the initial ClipboardCopyMode property value
Grid.ClipboardCopyMode := OldMode;
end;
// Selects a range of rows
procedure SelectRowRange (Grid, StartRowIndex, EndRowIndex);
begin
// Select the 1st row of the range
Grid.ClickRowIndicator (StartRowIndex);
// Extend the selection
Grid.ClickRowIndicator (EndRowIndex, skShift);
end;
C++Script, C#Script
function Main ()
{
var p, Grid, CopyModes, OldMode, i, FileName, FileExt;
FileName = "C:\\GridData_"; FileExt = ".txt";
CopyModes = new Array ("Disable", "EnableAlwaysIncludeHeaderText", "EnableWithAutoHeaderText", "EnableWithoutHeaderText");
// Obtain th grid object
p = Sys["Process"]("DataGridViewSample");
Grid = p["WinFormsObject"]("Form1")["WinFormsObject"]("dataGridView1");
// Select the range of cells in the grid
SelectCellRange (Grid, 1, 1, 6, 5);
// Save the initial ClipboardCopyMode property value
OldMode = Grid["ClipboardCopyMode"];
for (i in CopyModes)
{
// Clear the clipboard
Sys["Clipboard"] = "";
// Set the copy mode
Grid["ClipboardCopyMode"] = CopyModes[i];
// Copy selected cells to the clipboard
Grid["Keys"]("^C");
// Save the clipboard contents to a text file
aqFile["WriteToTextFile"] (FileName + CopyModes[i] + FileExt, Sys["Clipboard"], aqFile["ctANSI"], true);
}
// Restore the initial ClipboardCopyMode property value
Grid["ClipboardCopyMode"] = OldMode;
}
// Selects a range of rows
function SelectRowRange (Grid, StartRowIndex, EndRowIndex)
{
// Select the 1st row of the range
Grid["ClickRowIndicator"](StartRowIndex);
// Extend the selection
Grid["ClickRowIndicator"](EndRowIndex, skShift);
}
See Also
Working With Microsoft DataGridView
Selecting Cells in Microsoft DataGridView
Obtaining and Setting Cell Values in Microsoft DataGridView