Содержимое Datagrid с UI Automation и .net - PullRequest
5 голосов
/ 17 декабря 2011

У меня проблемы с чтением содержимого Datagrid во внешнем приложении с использованием UI Automation, и я могу использовать некоторые указатели.Вот что у меня есть:

int id = System.Diagnostics.Process.GetProcessesByName("Book")[0].Id;
AutomationElement desktop = AutomationElement.RootElement;

AutomationElement bw = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, id));

AutomationElement datagrid = bw.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "lv"));

AutomationElementCollection lines = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));

AutomationElementCollection items = lines[1].FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));

GridItemPattern pattern = items[1].GetCurrentPattern(GridItemPattern.Pattern) as GridItemPattern;
TableItemPattern tablePattern = items[1].GetCurrentPattern(TableItemPattern.Pattern) as TableItemPattern;

. Это работает настолько, насколько я могу получить доступ к идентификаторам столбцов и идентификаторам строк из GridItemPattern и TableItemPattern, но как мне получить доступ к значению в этой конкретной ячейке?Это вообще возможно?

Спасибо.

Ответы [ 4 ]

1 голос
/ 26 августа 2012

Наконец-то я понял, что для запроса свойства Name в AutomationElement требуется использование CacheRequest. Вот окончательный код:

var cacheRequest = new CacheRequest
{
    AutomationElementMode = AutomationElementMode.None,
    TreeFilter = Automation.RawViewCondition
};

cacheRequest.Add(AutomationElement.NameProperty);
cacheRequest.Add(AutomationElement.AutomationIdProperty);

cacheRequest.Push();

var targetText = loginLinesDetails[i].FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "TextBlock"));

cacheRequest.Pop();

var myString = targetText.Cached.Name;
0 голосов
/ 28 декабря 2011

Я не знаком с классами AutomationElement, но я использовал AutoIT , чтобы в прошлом автоматизировать некоторые простые элементы Windows (найти диалог, нажать кнопку и т. Д.), И это было просто. Вы могли бы рассмотреть это. Загрузка содержит .dll, на которую можно ссылаться из решения .Net.

Я не уверен, является ли внешнее приложение сеткой WinForm или нет, но вот пример сетки ASP.Net: http://www.autoitscript.com/forum/topic/13709-how-to-get-the-contents-of-datagrid-control/

Опять же, если вы копируете информацию из Интернета, я бы порекомендовал WatiN или Селен

0 голосов
/ 09 июля 2012

Вы можете попробовать использовать RawViewWalker для элемента, чтобы получить необработанные значения (В контрольном представлении вы не сможете получить несколько свойств)

0 голосов
/ 22 декабря 2011

Я думаю, вам нужно использовать ValuePattern для этого. Просто так:

ValuePattern pattern = items[0].GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
string value = pattern.Current.Value;
...