白色UI自动化:如何获取WPF DataGrid单元格的值?

4
我是一名对White项目非常陌生的新手,我只是在查看其功能。在我的工作中,我需要密集使用WPF和DataGrids,当列为DataGridTemplateColumn时,我无法获取DataGrid单元格的值。 这不仅适用于DataGridTemplateColumn,而是适用于所有列类型。 我的DataGrid如下:
    <my:DataGrid AutoGenerateColumns="False" Margin="25,28,42,34" Name="dataGrid1" >
        <my:DataGrid.Columns>
            <my:DataGridTemplateColumn Header="Header"  x:Name="koko" Width="200">
                <my:DataGridTemplateColumn.CellTemplate >
                    <DataTemplate >
                        <TextBlock Name="moko" Text="{Binding col1, Mode=OneWay,Converter={StaticResource fataGridHighlightConverter }}" ></TextBlock>

                    </DataTemplate>
                </my:DataGridTemplateColumn.CellTemplate>
                <my:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <Grid x:Name="myEditGrid" Loaded="myEditGrid_Loaded">
                        </Grid>
                    </DataTemplate>
                </my:DataGridTemplateColumn.CellEditingTemplate>
            </my:DataGridTemplateColumn>
        </my:DataGrid.Columns>
    </my:DataGrid>

我的测试结果是:

           [Test]
    public void TestDatagrid5()
    {
        var tab = _win.Get<ListView>(SearchCriteria.ByAutomationId("dataGrid1"));
        var count = tab.Rows.Count;
        var row = tab.Rows[1];
        ListViewCell x = row.Cells[1]; //Always count = 0 :(
    }

但是单元格计数始终为0,我需要获取单元格值!!!有什么帮助吗?

3个回答

1

我不喜欢这个答案,想要找到更好的方法来完成这个任务。

话虽如此,如果你询问ListViewRow项目在网格中的元素,然后获取UiAutomationElement并自己创建该元素的白色版本。

[Test]
public void TestDatagrid5()
{
  var tab = _win.Get<ListView>(SearchCriteria.ByAutomationId"dataGrid1"));

  var column = new List<string>();

  foreach (var r in tab.Rows)
  {
    var automationElement = r.GetElement(SearchCriteria.ByAutomationId("moko"));

    var label = new Label(automationElement, new NullActionListener());

    column.Add(label.Text);
  }

  Assert.That(column, Is.EquivalentTo(new[] { "what", "is", "expected" }));

}

0

我建议另一种方法。如果网格支持导出到CSV格式-请使用它。这将为您节省数月的工作时间!要是我早点知道就好了...

识别单元格并提取值可能很痛苦。许多网格控件都进行UI虚拟化。不适合视口的单元格将不会被创建。您必须滚动网格以强制其呈现。

个人而言,我使用DevExpress网格。他们的CSV导出保留了格式,因此您将获得与屏幕上显示的完全相同的值!


0
foreach (var r in tab.Rows) { var automationElement = r.GetElement(SearchCriteria.ByAutomationId("moko")); var label = new Label(automationElement, new NullActionListener()); column.Add(label.Text); } 作为警告,此方法可能无法获取所有行,只能获取可见的行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接