gpt4 book ai didi

c# - 编码UI : Why is searching for a cell so slow?

转载 作者:太空狗 更新时间:2023-10-29 23:09:57 26 4
gpt4 key购买 nike

我在 Winform 应用程序中有一个网格(FlexGrid,来自 ComponentOne),我试图在给定单元格的列索引及其值的情况下在该网格中找到一个单元格。

我在下面编写了扩展方法来遍历网格并找到该单元格。

我正在具有 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();
}

编辑

我将我的方法修改为如下所示(例如,我不再使用 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();
}

编辑#2:我已经按照@Andrii 的建议尝试使用 FindMatchingControls,我快到了,除了在单元格的列索引 (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();
}

最佳答案

我建议通过子控件执行直接循环 - 根据我的经验,在编码 UI 中搜索具有复杂搜索条件的控件通常运行缓慢。

编辑:

为了提高性能,最好删除计数表的子项并循环遍历行。另外,为了避免在查找没有行号的控件时出现异常,您可以使用 FindMatchingControls方法,如下所示:

    public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
{
Playback.PlaybackSettings.SmartMatchOptions = Microsoft.VisualStudio.TestTools.UITest.Extension.SmartMatchOptions.None;

WinCell cell = new WinCell(table);
cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());
cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);

UITestControlCollection foundControls = cell.FindMatchingControls();
if (foundControls.Count > 0)
{
cell = foundControls.List[0];
}
else
{
cell = null;
}

return cell;
}

当直接在表中搜索表字段时,将节省计算表中子控件的时间。此外,在不使用 for 循环的情况下进行搜索将节省用于为不匹配的行号的每次迭代搜索字段的时间。

由于行号遍历扩展中的所有可用值 - 从长远来看,它不是必不可少的搜索条件。同时,通过行号值的每次迭代都会调用额外的控制搜索请求 - 最终将方法的执行时间乘以网格中的行数。

关于c# - 编码UI : Why is searching for a cell so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9076988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com