Iterating through grid rows means accessing rows is a series, one by one. You may need to iterate through QuantumGrid rows if you need to locate a particular row in the grid, export the grid data to a file or perform the same set of operations on each row.
QuantumGrid can display data in several nested levels. Each grid level can have one or more views, which displays the data in a table, banded, card or other form. You can determine the number of views on a particular grid level using the wViewCount
property of the DevExpressQuantumGrid
or DevExpressQuantumGridLevel
object. To specify that you are working with data of a specific view, you can pass the view’s zero-based index or its caption in the View parameter of the DevExpressQuantumGridLevel
properties or methods.
To determine the number of rows in a particular grid view, you can use the wRowCount
property. Once you have determined the number of rows in a view, you can iterate through them in a loop. Since the numeration of rows is zero-based, index of the first row is 0, and index of the last row is wRowCount
-1. On each loop iteration, you can perform the needed actions with the current row. For example, you can modify values in its cells or save them to a file. For more information on how to obtain or modify grid cell values, see Obtaining and Setting Cell Values in Developer Express QuantumGrid.
If the grid control displays data of multiple nested tables, then after processing a data row you may need to process its child data. To access a child level, use the wChildLevel
property. You can then process a child level in the same way as the root level; by iterating through its views and their rows. That is, the algorithm of processing the QuantumGrid data implies that it is recursive.
In order for TestComplete to be able to perform these actions, the following conditions must be met:
When testing Developer Express QuantumGrid controls, use specific methods and properties of the corresponding |
Below is a script sample that demonstrates how you can iterate through the QuantumGrid rows using the mentioned properties. The script saves grid data along with view captions and column names to an XML file. It processes the data of the root grid level as well as child levels. Note that the routine only exports the actual grid data and does not save the grid’s grouping state.
Example
JavaScript
function Main ()
{
var p, Grid, FileName;
// Obtain the grid object
p = Sys.Process("Project1");
Grid = p.VCLObject("Form1").VCLObject("cxGrid1");
// Export the grid data to a file
FileName = "C:\\GridData.xml";
ExportToXml (Grid, FileName);
Log.File (FileName, "Exported grid data.");
}
function ExportToXml (Grid, FileName)
{
Indicator.PushText ("Exporting the grid data to a file...");
// Create a text file and open it for writing
let Overwrite = true;
let Unicode = true;
let fso = getActiveXObject("Scripting.FileSystemObject");
let XmlFile = fso.CreateTextFile (FileName, Overwrite, Unicode);
// Write the root tag
XmlFile.WriteLine ("<?xml version=\"1.0\"?>");
XmlFile.WriteLine ("<grid>");
ExportLevel (Grid, XmlFile, " ");
// Close the root tag
XmlFile.WriteLine ("</grid>");
// Close the file
XmlFile.Close();
Indicator.PopText();
}
function ExportLevel (Level, XmlFile, indent)
{
var ViewCaption, ColCaption, CellValue, CellText;
for (let ViewIndex=0; ViewIndex<Level.wViewCount; ViewIndex++)
{
// Write the opening tag
ViewCaption = ReplaceSpecialChars (Level.wView(ViewIndex)); // Replace special symbols
XmlFile.WriteLine (indent + "<view caption=\"" + ViewCaption + "\">");
// Export columns info
XmlFile.WriteLine (indent + " <columns>");
for (let j=0; j<Level.wColumnCount(ViewIndex); j++)
{
ColCaption = ReplaceSpecialChars (Level.wColumn(j, ViewIndex)); // Replace special symbols
XmlFile.WriteLine (indent + " <column>" + ColCaption + "</column>");
}
XmlFile.WriteLine (indent + " </columns>");
// Export the row data
XmlFile.WriteLine (indent + " <rows>");
for (let i=0; i<Level.wRowCount(ViewIndex); i++)
{
// Write the opening tag
XmlFile.WriteLine (indent + " <row>");
for (let j=0; j<Level.wColumnCount(ViewIndex); j++)
{
CellValue = Level.wValue(i, j, ViewIndex);
CellText = ReplaceSpecialChars(aqConvert.VarToStr(CellValue)); // Replace special symbols
// Write cell values
XmlFile.WriteLine (indent + " <cell>" + CellText + "</cell>");
}
// Check if the row has child data
if (!(strictEqualLevel.wChildLevel(i, ViewIndex)), null)
{
XmlFile.WriteLine (indent + " <childlevel>");
// Export child level data
ExportLevel (Level.wChildLevel(i, ViewIndex), XmlFile, indent + " ");
XmlFile.WriteLine (indent + " </childlevel>");
}
// Write the ending tag
XmlFile.WriteLine (indent + " </row>");
}
XmlFile.WriteLine (indent + " </rows>");
// Write the ending tag
XmlFile.WriteLine (indent + "</view>");
}
}
// Replaces special characters in the specified string
function ReplaceSpecialChars (str)
{
let s = aqString.Replace (str, "&", "&", true);
s = aqString.Replace (s, "<", "<", true);
s = aqString.Replace (s, ">", ">", true);
s = aqString.Replace (s, "\"", """, true);
s = aqString.Replace (s, "'", "'", true);
return s;
}
JScript
function Main ()
{
var p, Grid, FileName;
// Obtain the grid object
p = Sys.Process("Project1");
Grid = p.VCLObject("Form1").VCLObject("cxGrid1");
// Export the grid data to a file
FileName = "C:\\GridData.xml";
ExportToXml (Grid, FileName);
Log.File (FileName, "Exported grid data.");
}
function ExportToXml (Grid, FileName)
{
Indicator.PushText ("Exporting the grid data to a file...");
// Create a text file and open it for writing
var Overwrite = true;
var Unicode = true;
var fso = new ActiveXObject ("Scripting.FileSystemObject");
var XmlFile = fso.CreateTextFile (FileName, Overwrite, Unicode);
// Write the root tag
XmlFile.WriteLine ("<?xml version=\"1.0\"?>");
XmlFile.WriteLine ("<grid>");
ExportLevel (Grid, XmlFile, " ");
// Close the root tag
XmlFile.WriteLine ("</grid>");
// Close the file
XmlFile.Close();
Indicator.PopText();
}
function ExportLevel (Level, XmlFile, indent)
{
var ViewIndex, ViewCaption, ColCaption, i, j, CellValue, CellText;
for (ViewIndex=0; ViewIndex<Level.wViewCount; ViewIndex++)
{
// Write the opening tag
ViewCaption = ReplaceSpecialChars (Level.wView(ViewIndex)); // Replace special symbols
XmlFile.WriteLine (indent + "<view caption=\"" + ViewCaption + "\">");
// Export columns info
XmlFile.WriteLine (indent + " <columns>");
for (j=0; j<Level.wColumnCount(ViewIndex); j++)
{
ColCaption = ReplaceSpecialChars (Level.wColumn(j, ViewIndex)); // Replace special symbols
XmlFile.WriteLine (indent + " <column>" + ColCaption + "</column>");
}
XmlFile.WriteLine (indent + " </columns>");
// Export the row data
XmlFile.WriteLine (indent + " <rows>");
for (i=0; i<Level.wRowCount(ViewIndex); i++)
{
// Write the opening tag
XmlFile.WriteLine (indent + " <row>");
for (j=0; j<Level.wColumnCount(ViewIndex); j++)
{
CellValue = Level.wValue(i, j, ViewIndex);
CellText = ReplaceSpecialChars(aqConvert.VarToStr(CellValue)); // Replace special symbols
// Write cell values
XmlFile.WriteLine (indent + " <cell>" + CellText + "</cell>");
}
// Check if the row has child data
if (Level.wChildLevel(i, ViewIndex) != null)
{
XmlFile.WriteLine (indent + " <childlevel>");
// Export child level data
ExportLevel (Level.wChildLevel(i, ViewIndex), XmlFile, indent + " ");
XmlFile.WriteLine (indent + " </childlevel>");
}
// Write the ending tag
XmlFile.WriteLine (indent + " </row>");
}
XmlFile.WriteLine (indent + " </rows>");
// Write the ending tag
XmlFile.WriteLine (indent + "</view>");
}
}
// Replaces special characters in the specified string
function ReplaceSpecialChars (str)
{
var s = aqString.Replace (str, "&", "&", true);
s = aqString.Replace (s, "<", "<", true);
s = aqString.Replace (s, ">", ">", true);
s = aqString.Replace (s, "\"", """, true);
s = aqString.Replace (s, "'", "'", true);
return s;
}
Python
def Main ():
# Obtain the grid object
p = Sys.Process("Project1")
Grid = p.VCLObject("Form1").VCLObject("cxGrid1")
# Export the grid data to a file
FileName = "C:\\GridData.xml"
ExportToXml (Grid, FileName)
Log.File (FileName, "Exported grid data.")
def ExportToXml (Grid, FileName):
Indicator.PushText ("Exporting the grid data to a file...")
# Create a text file and open it for writing
Overwrite = True
Unicode = True
fso = Sys.OleObject ["Scripting.FileSystemObject"]
XmlFile = fso.CreateTextFile (FileName, Overwrite, Unicode)
# Write the root tag
XmlFile.WriteLine ("<?xml version=\"1.0\"?>")
XmlFile.WriteLine ("<grid>")
ExportLevel (Grid, XmlFile, " ")
# Close the root tag
XmlFile.WriteLine ("</grid>")
# Close the file
XmlFile.Close()
Indicator.PopText()
def ExportLevel (Level, XmlFile, indent):
for ViewIndex in range(0, Level.wViewCount-1):
# Write the opening tag
ViewCaption = ReplaceSpecialChars (Level.wView[ViewIndex]) # Replace special symbols
XmlFile.WriteLine (indent + "<view caption=\"" + ViewCaption + "\">")
# Export columns info
XmlFile.WriteLine (indent + " <columns>")
for j in range(0, Level.wColumnCount[ViewIndex]-1):
ColCaption = ReplaceSpecialChars (Level.wColumn[j, ViewIndex]) # Replace special symbols
XmlFile.WriteLine (indent + " <column>" + ColCaption + "</column>")
XmlFile.WriteLine (indent + " </columns>")
# Export the row data
XmlFile.WriteLine (indent + " <rows>")
for i in range(0, Level.wRowCount(ViewIndex)-1):
# Write the opening tag
XmlFile.WriteLine (indent + " <row>")
for j in range(0, Level.wColumnCount(ViewIndex)-1):
CellValue = Level.wValue[i, j, ViewIndex]
CellText = ReplaceSpecialChars(aqConvert.VarToStr(CellValue)) # Replace special symbols
# Write cell values
XmlFile.WriteLine (indent + " <cell>" + CellText + "</cell>")
# Check if the row has child data
if (Level.wChildLevel[i, ViewIndex] != None):
XmlFile.WriteLine (indent + " <childlevel>")
# Export child level data
ExportLevel (Level.wChildLevel[i, ViewIndex], XmlFile, indent + " ")
XmlFile.WriteLine (indent + " </childlevel>")
# Write the ending tag
XmlFile.WriteLine (indent + " </row>")
XmlFile.WriteLine (indent + " </rows>")
# Write the ending tag
XmlFile.WriteLine (indent + "</view>")
# Replaces special characters in the specified string
def ReplaceSpecialChars (str):
s = aqString.Replace (str, "&", "&", True)
s = aqString.Replace (s, "<", "<", True)
s = aqString.Replace (s, ">", ">", True)
s = aqString.Replace (s, "\"", """, True)
s = aqString.Replace (s, "'", "'", True)
return s
VBScript
Sub Main
Dim p, Grid, FileName
' Obtain the grid object
Set p = Sys.Process("Project1")
Set Grid = p.VCLObject("Form1").VCLObject("cxGrid1")
' Export the grid data to a file
FileName = "C:\\GridData.xml"
Call ExportToXml (Grid, FileName)
Call Log.File (FileName, "Exported grid data.")
End Sub
Sub ExportToXml (Grid, FileName)
Dim fso, XmlFile, Overwrite, Unicode
Indicator.PushText ("Exporting the grid data to a file...")
' Create a text file and open it for writing
Overwrite = True
Unicode = True
Set fso = CreateObject ("Scripting.FileSystemObject")
Set XmlFile = fso.CreateTextFile (FileName, Overwrite, Unicode)
' Write the root tag
Call XmlFile.WriteLine ("<?xml version=""1.0""?>")
XmlFile.WriteLine ("<grid>")
'Grid.BeginUpdate
Call ExportLevel (Grid, XmlFile, " ")
'Grid.EndUpdate
' Close the root tag
XmlFile.WriteLine ("</grid>")
' Close the file
XmlFile.Close
Indicator.PopText
End Sub
Sub ExportLevel (Level, XmlFile, indent)
Dim ViewIndex, ViewCaption, ColCaption, i, j, CellValue, CellText
For ViewIndex = 0 To Level.wViewCount - 1
' Write the opening tag
ViewCaption = ReplaceSpecialChars (Level.wView(ViewIndex)) ' Replace special symbols
Call XmlFile.WriteLine (indent & "<view caption=""" & ViewCaption & """>")
' Export columns info
XmlFile.WriteLine (indent & " <columns>")
For j = 0 To Level.wColumnCount(ViewIndex) - 1
ColCaption = ReplaceSpecialChars (Level.wColumn(j, ViewIndex)) ' Replace special symbols
XmlFile.WriteLine (indent & " <column>" & ColCaption & "</column>")
Next
XmlFile.WriteLine (indent & " </columns>")
' Export the row data
XmlFile.WriteLine (indent & " <rows>")
For i = 0 To Level.wRowCount(ViewIndex) - 1
' Write the opening tag
XmlFile.WriteLine (indent & " <row>")
For j = 0 To Level.wColumnCount(ViewIndex) - 1
CellValue = Level.wValue(i, j, ViewIndex)
CellText = ReplaceSpecialChars(aqConvert.VarToStr(CellValue)) ' Replace special symbols
' Write cell values
XmlFile.WriteLine (indent & " <cell>" & CellText & "</cell>")
Next
' Check if the row has child data
If Not (Level.wChildLevel(i, ViewIndex) Is Nothing) Then
XmlFile.WriteLine (indent & " <childlevel>")
' Export child level data
Call ExportLevel (Level.wChildLevel(i, ViewIndex), XmlFile, indent & " ")
XmlFile.WriteLine (indent & " </childlevel>")
End If
' Write the ending tag
XmlFile.WriteLine (indent & " </row>")
Next
XmlFile.WriteLine (indent & " </rows>")
' Write the ending tag
XmlFile.WriteLine (indent & "</view>")
Next
End Sub
' Replaces special characters in the specified string
Function ReplaceSpecialChars (str)
Dim s
s = aqString.Replace (str, "&", "&", True)
s = aqString.Replace (s, "<", "<", True)
s = aqString.Replace (s, ">", ">", True)
s = aqString.Replace (s, """", """, True)
s = aqString.Replace (s, "'", "'", True)
ReplaceSpecialChars = s
End Function
DelphiScript
procedure ExportToXml (Grid, FileName); forward;
procedure ExportLevel (Level, XmlFile, indent); forward;
function ReplaceSpecialChars (str); forward;
procedure Main;
var p, Grid, FileName : OleVariant;
begin
// Obtain the grid object
p := Sys.Process('Project1');
Grid := p.VCLObject('Form1').VCLObject('cxGrid1');
// Export the grid data to a file
FileName := 'C:\GridData.xml';
ExportToXml (Grid, FileName);
Log.File (FileName, 'Exported grid data.');
end;
procedure ExportToXml (Grid, FileName);
var fso, XmlFile, Overwrite, Unicode: OleVariant;
begin
Indicator.PushText ('Exporting the grid data to a file...');
// Create a text file and open it for writing
Overwrite := true;
Unicode := true;
fso := Sys.OleObject ('Scripting.FileSystemObject');
XmlFile := fso.CreateTextFile (FileName, Overwrite, Unicode);
// Write the root tag
XmlFile.WriteLine ('<?xml version="1.0"?>');
XmlFile.WriteLine ('<grid>');
//Grid.BeginUpdate;
ExportLevel (Grid, XmlFile, ' ');
//Grid.EndUpdate;
// Close the root tag
XmlFile.WriteLine ('</grid>');
// Close the file
XmlFile.Close;
Indicator.PopText();
end;
procedure ExportLevel (Level, XmlFile, indent);
var ViewIndex, ViewCaption, ColCaption, i, j, CellValue, CellText : OleVariant;
begin
for ViewIndex := 0 to Level.wViewCount - 1 do
begin
// Write the opening tag
ViewCaption := ReplaceSpecialChars (Level.wView[ViewIndex]); // Replace special symbols
XmlFile.WriteLine (indent + '<view caption="' + ViewCaption + '">');
// Export columns info
XmlFile.WriteLine (indent + ' <columns>');
for j := 0 to Level.wColumnCount[ViewIndex] - 1 do
begin
ColCaption := ReplaceSpecialChars (Level.wColumn[j, ViewIndex]); // Replace special symbols
XmlFile.WriteLine (indent + ' <column>' + ColCaption + '</column>');
end;
XmlFile.WriteLine (indent + ' </columns>');
// Export the row data
XmlFile.WriteLine (indent + ' <rows>');
for i := 0 to Level.wRowCount[ViewIndex] - 1 do
begin
// Write the opening tag
XmlFile.WriteLine (indent + ' <row>');
for j := 0 to Level.wColumnCount[ViewIndex] - 1 do
begin
CellValue := Level.wValue[i, j, ViewIndex];
CellText := ReplaceSpecialChars(aqConvert.VarToStr(CellValue)); // Replace special symbols
// Write cell values
XmlFile.WriteLine (indent + ' <cell>' + CellText + '</cell>');
end;
// Check if the row has child data
if Level.wChildLevel[i, ViewIndex] <> nil then
begin
XmlFile.WriteLine (indent + ' <childlevel>');
// Export child level data
ExportLevel (Level.wChildLevel[i, ViewIndex], XmlFile, indent + ' ');
XmlFile.WriteLine (indent + ' </childlevel>');
end;
// Write the ending tag
XmlFile.WriteLine (indent + ' </row>');
end;
XmlFile.WriteLine (indent + ' </rows>');
// Write the ending tag
XmlFile.WriteLine (indent + '</view>');
end;
end;
// Replaces special characters in the specified string
function ReplaceSpecialChars (str);
var s : OleVariant;
begin
s := aqString.Replace (str, '&', '&', true);
s := aqString.Replace (s, '<', '<', true);
s := aqString.Replace (s, '>', '>', true);
s := aqString.Replace (s, '"', '"', true);
s := aqString.Replace (s, '''', ''', true);
Result := s;
end;
C++Script, C#Script
function Main ()
{
var p, Grid, FileName;
// Obtain the grid object
p = Sys["Process"]("Project1");
Grid = p["VCLObject"]("Form1")["VCLObject"]("cxGrid1");
// Export the grid data to a file
FileName = "C:\\GridData.xml";
ExportToXml (Grid, FileName);
Log["File"](FileName, "Exported grid data.");
}
function ExportToXml (Grid, FileName)
{
Indicator["PushText"]("Exporting the grid data to a file...");
// Create a text file and open it for writing
var Overwrite = true;
var Unicode = true;
var fso = new ActiveXObject ("Scripting.FileSystemObject");
var XmlFile = fso["CreateTextFile"](FileName, Overwrite, Unicode);
// Write the root tag
XmlFile["WriteLine"]("<?xml version=\"1.0\"?>");
XmlFile["WriteLine"]("<grid>");
ExportLevel (Grid, XmlFile, " ");
// Close the root tag
XmlFile["WriteLine"]("</grid>");
// Close the file
XmlFile["Close"]();
Indicator["PopText"]();
}
function ExportLevel (Level, XmlFile, indent)
{
var ViewIndex, ViewCaption, ColCaption, i, j, CellValue, CellText;
for (ViewIndex=0; ViewIndex<Level["wViewCount"]; ViewIndex++)
{
// Write the opening tag
ViewCaption = ReplaceSpecialChars (Level["wView"](ViewIndex)); // Replace special symbols
XmlFile["WriteLine"](indent + "<view caption=\"" + ViewCaption + "\">");
// Export columns info
XmlFile["WriteLine"](indent + " <columns>");
for (j=0; j<Level["wColumnCount"](ViewIndex); j++)
{
ColCaption = ReplaceSpecialChars (Level["wColumn"](j, ViewIndex)); // Replace special symbols
XmlFile["WriteLine"](indent + " <column>" + ColCaption + "</column>");
}
XmlFile["WriteLine"](indent + " </columns>");
// Export the row data
XmlFile["WriteLine"](indent + " <rows>");
for (i=0; i<Level["wRowCount"](ViewIndex); i++)
{
// Write the opening tag
XmlFile["WriteLine"](indent + " <row>");
for (j=0; j<Level["wColumnCount"](ViewIndex); j++)
{
CellValue = Level["wValue"](i, j, ViewIndex);
CellText = ReplaceSpecialChars(aqConvert["VarToStr"](CellValue)); // Replace special symbols
// Write cell values
XmlFile["WriteLine"](indent + " <cell>" + CellText + "</cell>");
}
// Check if the row has child data
if (Level["wChildLevel"](i, ViewIndex) != null)
{
XmlFile["WriteLine"](indent + " <childlevel>");
// Export child level data
ExportLevel (Level["wChildLevel"](i, ViewIndex), XmlFile, indent + " ");
XmlFile["WriteLine"](indent + " </childlevel>");
}
// Write the ending tag
XmlFile["WriteLine"](indent + " </row>");
}
XmlFile["WriteLine"](indent + " </rows>");
// Write the ending tag
XmlFile["WriteLine"](indent + "</view>");
}
}
// Replaces special characters in the specified string
function ReplaceSpecialChars (str)
{
var s = aqString["Replace"](str, "&", "&", true);
s = aqString["Replace"](s, "<", "<", true);
s = aqString["Replace"](s, ">", ">", true);
s = aqString["Replace"](s, "\"", """, true);
s = aqString["Replace"](s, "'", "'", true);
return s;
}
See Also
Working With Developer Express QuantumGrid
Searching for Records in Developer Express QuantumGrid
Obtaining and Setting Cell Values in Developer Express QuantumGrid
wRowCount Property (Specific to DevExpressQuantumGrid Controls)
wViewCount Property (Specific to Developer Express QuantumGrid Controls)
wChildLevel Property (Specific to Developer Express QuantumGrid Controls)