【问题标题】:White UI Automation : Get WPF DataGrid cell value?白色 UI 自动化:获取 WPF DataGrid 单元格值?
【发布时间】:2024-01-14 05:15:01
【问题描述】:

我对白色项目非常陌生,我只是检查它的功能......在我的工作中,我集中处理 wpf 和数据网格, 当列为 DataGridTemplateColumn 时,我无法获取 datagrid 单元格的值。

它不仅适用于 DataGridTemplateColumn,它适用于所有列类型。

我的数据网格是:

    <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,我需要获取单元格值!!!?请帮忙!

【问题讨论】:

    标签: wpf wpfdatagrid ui-automation white-framework


    【解决方案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" }));
    
    }
    

    【讨论】:

      【解决方案2】:

      foreach(tab.Rows 中的变量 r) { varautomationElement = r.GetElement(SearchCriteria.ByAutomationId("moko"));

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

      column.Add(label.Text); }

      作为警告,此方法可能不适用于仅获取可见行的所有行

      【讨论】:

        【解决方案3】:

        我建议另一种方法。如果网格支持导出到 CSV - 请改用它。这将为您节省几个月的工作量!要是我早知道就好了……

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

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

        【讨论】: