CodedUI: Почему поиск ячейки происходит так медленно?

У меня есть сетка (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();
    }
5
задан David 31 January 2012 в 13:25
поделиться