C# 从数据网格AutomationUI检索单元格内容

C# 从数据网格AutomationUI检索单元格内容,c#,wpf,ui-automation,C#,Wpf,Ui Automation,非常简单,尝试获取特定行中每个单元格中的数据。 代码示例(请阅读注释) //获取主窗口 AutomationElement prog=AutomationElement.RootElement.FindFirst(TreeScope.Children, 新属性条件(AutomationElement.NameProperty,mainTitle)); //获取数据网格 var datagrid=prog.FindFirst(TreeScope.Children, 新属性条件(Automation

非常简单,尝试获取特定行中每个单元格中的数据。 代码示例(请阅读注释)

//获取主窗口
AutomationElement prog=AutomationElement.RootElement.FindFirst(TreeScope.Children,
新属性条件(AutomationElement.NameProperty,mainTitle));
//获取数据网格
var datagrid=prog.FindFirst(TreeScope.Children,
新属性条件(AutomationElement.AutomationdProperty,“AccountGrid”);
//获取行(返回正确的值)
var rows=datagrid.FindAll(TreeScope.productions,
新属性条件(AutomationElement.ControlTypeProperty、ControlType.DataItem);
foreach(行中的AutomationElement行)
{
//不为null并返回5,作为每行中的单元格数
var findRow=row.FindAll(TreeScope.Children,
新属性条件(AutomationElement.ControlTypeProperty、ControlType.Custom));
WriteLine(“findrow是否为null?”:“+(findrow==null)+”单元格计数:“+findrow.count”);
for(int i=0;i
基本上正如你所看到的,我可以很容易地得到行的数量,每行中的单元格数量,但是当检索单元格数据时,它返回null。这可能是缓存问题吗


(很抱歉设置了格式)

因此,在对其进行了一点修改后,我发现我实际上不需要推送缓存,我可以直接在单元格中执行以下操作:

try
{
    AutomationElement prog = AutomationElement.RootElement.FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.NameProperty, "Window Title"));
    var datagrid = prog.FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.AutomationIdProperty, "Your grid"));
    var rows = datagrid.FindAll(TreeScope.Children,
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
    foreach (AutomationElement row in rows)
    {
        var findRow = row.FindAll(TreeScope.Children,
            new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));
        Console.WriteLine("===============");
        Console.WriteLine(findRow[1].Current.Name);
    }

    Console.WriteLine("===============");
}
catch (Exception e)
{
    Console.WriteLine(string.Format("{0}{1}", e.Message,
        " At Line:" + e.StackTrace.Substring(e.StackTrace.LastIndexOf(' '))));
}
Console.ReadLine();

这将获得每行的第二个单元格。

因此,在对其进行了一点修改后,我发现我实际上不需要推送缓存,我可以直接推送一个单元格:

try
{
    AutomationElement prog = AutomationElement.RootElement.FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.NameProperty, "Window Title"));
    var datagrid = prog.FindFirst(TreeScope.Children,
        new PropertyCondition(AutomationElement.AutomationIdProperty, "Your grid"));
    var rows = datagrid.FindAll(TreeScope.Children,
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
    foreach (AutomationElement row in rows)
    {
        var findRow = row.FindAll(TreeScope.Children,
            new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));
        Console.WriteLine("===============");
        Console.WriteLine(findRow[1].Current.Name);
    }

    Console.WriteLine("===============");
}
catch (Exception e)
{
    Console.WriteLine(string.Format("{0}{1}", e.Message,
        " At Line:" + e.StackTrace.Substring(e.StackTrace.LastIndexOf(' '))));
}
Console.ReadLine();
这将获取每行的第二个单元格