У меня есть сетка (FlexGrid, от ComponentOne) в приложении Winform, и я пытаюсь найти ячейку в этой сетке, учитывая индекс столбца ячейки и ее значение.
Я написал метод расширения ниже, чтобы просмотреть сетку и найти эту ячейку.
Я тестирую этот метод на сетке, имеющей 6 столбцов и 64 строки. Потребовалось 10 минут, чтобы мой код нашел нужную ячейку (которая была в последней строке)
Есть ли способ ускорить алгоритм?
Примечание: я также пробовал установить PlayBack.PlayBackSetting.SmartMatchOption в TopLevelWindow, но это, похоже, ничего не изменило...
Спасибо!
public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue)
{
int count = table.GetChildren().Count;
for (int rowIndex = 0; rowIndex < count; rowIndex++)
{
WinRow row = new WinRow(table);
WinCell cell = new WinCell(row);
row.SearchProperties.Add(WinRow.PropertyNames.RowIndex, rowIndex.ToString());
cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());
cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
if (cell.Exists)
return cell;
}
return new WinCell();
}
Edit
Я изменил свой метод так, как показано ниже (например, я больше не использую winrow), это кажется примерно в 3 раза быстрее. Тем не менее, для поиска ячейки в таблице с 3 строками и 6 столбцами требуется 7 секунд, так что это все еще довольно медленно...
Я отмечу этот ответ как принятый позже, чтобы оставить время другим людям предложить что-то лучшее
public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
{
Playback.PlaybackSettings.SmartMatchOptions = Microsoft.VisualStudio.TestTools.UITest.Extension.SmartMatchOptions.None;
int count = table.GetChildren().Count;
for (int rowIndex = 0; rowIndex < count; rowIndex++)
{
WinCell cell = new WinCell(table);
cell.SearchProperties.Add(WinRow.PropertyNames.RowIndex, rowIndex.ToString());
cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());
cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
if (cell.Exists)
return cell;
}
return new WinCell();
}
Edit #2: Я попробовал использовать FindMatchingControls согласно предложению @Andrii, и я почти достиг цели, за исключением того, что в приведенном ниже коде индекс столбца ячейки (c.ColumnIndex) имеет неправильное значение...
public static WinCell FindCellByColumnAndValue2(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
{
WinRow row = new WinRow(table);
//Filter rows containing the wanted value
row.SearchProperties.Add(new PropertyExpression(WinRow.PropertyNames.Value, strCellValue, PropertyExpressionOperator.Contains));
var rows = row.FindMatchingControls();
foreach (var r in rows)
{
WinCell cell = new WinCell(r);
cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
//Filter cells with the wanted value in the current row
var controls = cell.FindMatchingControls();
foreach (var ctl in controls)
{
var c = ctl as WinCell;
if (c.ColumnIndex == colIndex)//ERROR: The only cell in my table with the correct value returns a column index of 2, instead of 0 (being in the first cell)
return c;
}
}
return new WinCell();
}