Hi,
I am trying to write a Coded UI project to get all the values in a column of an UltraGrid.
I have an UltraWinGrid with more rows than can be displayed on screen, so there are rows that have to be scrolled to be visible.
I have a Coded UI project that can iterate through all currently visible rows and get cell values.
I could send keystrokes to key down the grid, eg
1. Select Grid2. Ctrl-Home to guarantee top row is top3. Page Down so that top row is still top, but cursor is at bottom visible row4. Read top row5. Send down cursor keystroke. 6. Go to 4 until we are at bottom7. Iterate through remaining visible rows.
My question is how do I know that I am at the bottom of the grid (step 6)
I am using 2012 volume 2. .Net 4.0 application.The test project is in Visual Studio 2012 .Net 4.5.
Thanks
David
Hello David.
It is much easier to iterate through all the rows by using the UIA patterns. The underlying UIA AutomationElement can be retrieved using the NativeElement property of the UITestControl.
The following sample code will use UIA patterns to iterate through all the rows, and extract the cell value for the first column into a list.
//============================== // This sample code will extract all the values for the first column and put them into a list. int rowIndex = 0; List<string> cellValues = new List<string>(); System.Windows.Automation.AutomationElement containerAutomationElement = uIColScrollRegion0RowSTree.NativeElement as System.Windows.Automation.AutomationElement; System.Windows.Automation.AutomationElement rowAutomationElement = null; System.Windows.Automation.ItemContainerPattern containerPattern = containerAutomationElement.GetCurrentPattern(System.Windows.Automation.ItemContainerPattern.Pattern) as System.Windows.Automation.ItemContainerPattern; rowAutomationElement = containerPattern.FindItemByProperty( null, System.Windows.Automation.AutomationElement.AutomationIdProperty, rowIndex.ToString()); while (rowAutomationElement != null) { // get the collection of cell automation elements System.Windows.Automation.AutomationElementCollection cellsAutomationElements = rowAutomationElement.FindAll(System.Windows.Automation.TreeScope.Children, System.Windows.Automation.Condition.TrueCondition);
// get the automation element for the first cell System.Windows.Automation.AutomationElement cellAutomationElement = cellsAutomationElements[0];
// Scroll the cell into view. This is necessary due to an existing bug which should be addressed shortly. System.Windows.Automation.ScrollItemPattern scrollPattern = cellAutomationElement.GetCurrentPattern(System.Windows.Automation.ScrollItemPattern.Pattern) as System.Windows.Automation.ScrollItemPattern; scrollPattern.ScrollIntoView();
// use the ValuePattern to get the Value. System.Windows.Automation.ValuePattern valuePattern = cellAutomationElement.GetCurrentPattern(System.Windows.Automation.ValuePattern.Pattern) as System.Windows.Automation.ValuePattern; cellValues.Add(valuePattern.Current.Value);
// get the next row rowIndex++; rowAutomationElement = containerPattern.FindItemByProperty(null, System.Windows.Automation.AutomationElement.AutomationIdProperty, rowIndex.ToString()); } // do something with the list of cell values. //==============================
Let us know if you need further assistance.
Chris
Hello, I'm having the same issue but with a WPF DataGrid. Only loading rows when they come into view.
Just wondering if the solution above would work with this too?
Thanks.