Перейти к содержимому

Фотография

DevExpress ListTree Control


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 58

#1 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 10:30

Привет.
Есть на форме DevExpress ListTree control. В нем два объекта типа CheckBox (т.е. я могу галку поставить :))) )...но в ObjectBrowser показывются как :

["WinFormsObject"]("VTLScrollBar", "", 1)
["WinFormsObject"]("HTLScrollBar", "", 1).

Я хочу по очереди делать Check/Uncheck этих двух объектов. Делаю так :

w3 = w2["WinFormsObject"]("MemberListTreeControl", "", 2);
while (w3["HasChildren"]) {
w3["Select"]();
w3["NodesIterator"]["GetNextVisible"](w3["Nodes"]);
}

проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?
  • 0

#2 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 ноября 2007 - 10:44

проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?


скорее всего вам надо взять координаты нужного Node и сделать Click для всего treeList, но в конкретных координатах.
Чтобы узнать координаты Node'a попробуйте посмотреть его свойсвтво AccessibilityObject.Bounds. Если не

Если там все параметры равны нулю, то попробуйте посмотреть свойство UIElement.Bounds.

Если и это не подойдет, попробуйте посмотреть свойство AccessibilityObject для всего treeList, в нем может быть коллекция типа Items, а там уже надо смотреть внимательно

ЗЫ это лишь теоретические рассуждения, основанные на работе с Инфраджистиками, но может поможет
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#3 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 11:14

проблема в том что у объeктов Nodes нету метода Click. А у родительского объекта TreeList нету ничего типа Child или Items. Может надо по другому делать ?


скорее всего вам надо взять координаты нужного Node и сделать Click для всего treeList, но в конкретных координатах.
Чтобы узнать координаты Node'a попробуйте посмотреть его свойсвтво AccessibilityObject.Bounds. Если не

Если там все параметры равны нулю, то попробуйте посмотреть свойство UIElement.Bounds.

Если и это не подойдет, попробуйте посмотреть свойство AccessibilityObject для всего treeList, в нем может быть коллекция типа Items, а там уже надо смотреть внимательно

ЗЫ это лишь теоретические рассуждения, основанные на работе с Инфраджистиками, но может поможет


В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((
  • 0

#4 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 ноября 2007 - 12:43

В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((


в общем, посмотрел я этот ТрииЛист. Конечно, работать с ДевЭкспрессовскими контролами просто ужасно по сравнению с Инфраджистиками. Но проблему вашу я решил.

Прежде всего, необходимо понять, как этот контрол устроен. Есть Nodes, но в каждом из Nodes есть колонки. Ваш чекбокс, который надо включать/выключать - это отдельная колонка в триЛистее. К сожалению, я не нашел способа, как можно посмотреть в Object Browser'e значение конкретного Noda и конкретной колонки. Поэтому вот вам алгоритм.

1) узнать номер колонки, в которой находится чекбокс. Для этого в первой строке триЛиста включите галочку и выполните вот такой вот код
Log.Message(treeList.Nodes.Item(0).GetValue(5));

Здесь 0 - это номер ноды, 5 - номер колонки. Вам вместо 5 надо подставлять значения 0, 1, ..., n , пока в логе вам не выведется Checked. Вы нашли номер колонки, в которой находятся чекбоксы.

Теперь для того, чтобы в какой-то ноде включить/выключить этот чекбокс, достаточно выполнить код

treeList.Nodes.Item(1).SetValue(5, 0);

здесь:
1 - номер ноды
5 - номер колонки (которую вы нашли перед этим)
0 - состояние чекбокса (0 - выключено, 1 - включено)

Конечно, можно было оформить это в виде красивого кода, но думаю, что вы разберетесь. Тем более, что сделать осталось немного :)

Если что, я тренировался на примере, который поставляется с эвалюэйшн версией ДевЭкспресса, раздел Explorer. Вот пример кода, который у меня работает
function Test17()
{
  Sys.Process("TreeListMainDemo").WinFormsObject("frmMain").Activate();
  var treeList = Sys.Process("TreeListMainDemo").WinFormsObject("frmMain").WinFormsObject("treeList1");
  Log.Message(treeList.Nodes.Item(0).GetValue(5));
  Log.Message(treeList.Nodes.Item(1).GetValue(5));
  treeList.Nodes.Item(1).SetValue(5, 0);
  BuiltIn.Delay(2000);
  treeList.Nodes.Item(1).SetValue(5, 1);  
}

  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#5 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 13:44

В AccessibilityObject.Bounds все по нулям, UIElement вообще нету, а в treeList нету Коллекции типа Items. =((


1) узнать номер колонки, в которой находится чекбокс. Для этого в первой строке триЛиста включите галочку и выполните вот такой вот код
Log.Message(treeList.Nodes.Item(0).GetValue(5));

Здесь 0 - это номер ноды, 5 - номер колонки. Вам вместо 5 надо подставлять значения 0, 1, ..., n , пока в логе вам не выведется Checked. Вы нашли номер колонки, в которой находятся чекбоксы.

Теперь для того, чтобы в какой-то ноде включить/выключить этот чекбокс, достаточно выполнить код

treeList.Nodes.Item(1).SetValue(5, 0);

здесь:
1 - номер ноды
5 - номер колонки (которую вы нашли перед этим)
0 - состояние чекбокса (0 - выключено, 1 - включено)

Конечно, можно было оформить это в виде красивого кода, но думаю, что вы разберетесь. Тем более, что сделать осталось немного :)


Огромное Спасибо, что помогаете разобраться в этом !!! Но у меня чего-то не получилось узнать номер колонки...сделал так :
w3 = w2["WinFormsObject"]("MemberListTreeControl", "", 2);
  for (var i = 0; i < 100; i++ ) {
	Log.Message(w3["Nodes"]["Item"](1).GetValue(i));
  }

для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?
  • 0

#6 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 ноября 2007 - 13:54

для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?


колонок может быть сколько угодно, но это вы можете проверить лекго, посмотрев свойство Columns.Count
и еще можно попробовать вот так
Log.Message(w3["Nodes"]["Item"](1).GetValue(i).OleValue)

только оберните эту команду в try...catch
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#7 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 14:18

для Item(1) и Item(0). У меня в Логе все пустые строки...т.е. Value никакого не ставиться, хотя в CheckBoxe галку поставил:( Может быть так что номер колонки больше чем 100 ? Вообще логики не понимаю, зачем так нумеровать ?


колонок может быть сколько угодно, но это вы можете проверить лекго, посмотрев свойство Columns.Count
и еще можно попробовать вот так
Log.Message(w3["Nodes"]["Item"](1).GetValue(i).OleValue)

только оберните эту команду в try...catch


неа..ловится exception что объект либо null либо его нет. Странно то, что Сolumns.COunt у меня две, так и должно быть, но почему тогда не ловится что CheckBox выделен ?!
Я смог добраться через ObjectBrowser до свойства с текстом который около CheckBox должен писаться, но как добится того чтобы CheckBox заработал не знаю. Я даже так попробовал :
Log.Message(w3["Nodes"]["FirstNode"]["GetValue"](i)); все равно пустые строчки..ничего про статус Checked
  • 0

#8 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 15:00

Проделал вот еще такое :

Log.Message(w3["Columns"]["Item_2"](0).FieldName.OleValue); (именно Item_2!! )

он выводит имена филдов. Т.е. я вижу как называется колонка и по идее я должен тогда знать ее номер. В данном случае "0"

Далее : w3["Nodes"]["Item"](0).SetValue(0, 0); //судя по тому что колонка нулевая и надо выключить CheckBox, то SetValue (0 , 0); и ничего не изменяется.
НО, я делаю это от элемента Item, а не от Item_2. У Item_2 нету метода SetValue.
  • 0

#9 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 06 ноября 2007 - 15:42

Напишите имя класса контрола (выберите дерево и гляньте свойство "ClrFullClassName").
А вообще, попросите разработчиков написать небольшое тестовое приложение с Вашим контролом и выложите его здесь!
  • 0

#10 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 15:47

Напишите имя класса контрола (выберите дерево и гляньте свойство "ClrFullClassName").
А вообще, попросите разработчиков написать небольшое тестовое приложение с Вашим контролом и выложите его здесь!


ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
  • 0

#11 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 06 ноября 2007 - 15:53

ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс


А "ProductName" и "ProductVersion"?
  • 0

#12 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 16:03

ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс


А "ProductName"?


MyProduct. А как это может влиять на проблему ?
  • 0

#13 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 06 ноября 2007 - 16:16

MyProduct. А как это может влиять на проблему ?


Просто хотелось узнать, какой именно DevExpress'овский контрол используется (для написания тестовой формы).
  • 0

#14 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 16:17

MyProduct. А как это может влиять на проблему ?


Просто хотелось узнать, какой именно DevExpress'овский контрол используется (для написания тестовой формы).


ну так обычный XtraTreeList control. Он у них помоему один с treeList.
  • 0

#15 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 ноября 2007 - 16:25

ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
..........
ну так обычный XtraTreeList control. Он у них помоему один с treeList.


то ли тут играет роль версия ДевЭкспресса, то ли одно из двух
потому что у меня
ClrFullClassName = DevExpress.XtraTreeList.TreeList

Dev.Express v.6.3
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#16 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 16:29

ClrFullClassName = CommonUI.MemberListTreeControl
Вот такой класс
..........
ну так обычный XtraTreeList control. Он у них помоему один с treeList.


то ли тут играет роль версия ДевЭкспресса, то ли одно из двух
потому что у меня
ClrFullClassName = DevExpress.XtraTreeList.TreeList

Dev.Express v.6.3


Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);

если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.
  • 0

#17 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 ноября 2007 - 16:57

Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);

если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.


конечно. Отмечаются и отключаются, как и положено
если бы не отмечались, я бы не стал писать

Вот пример кода, который у меня работает

;)

а насчет классов... попробуйте (если есть возможность) проверить этот код с простым приложением и простым контролом. Если заработает - значит класс, который наследуется от treeList и используется в вашем приложении, что-то перекрывает/перегружает. Методы какие-то.
Ну или версии у нас разные и в вашей версии работа с этим контролом должна делаться как-то иначе
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#18 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 17:23

Т.е. у вас после строчек типа :
w3["Nodes"]["Item"](0)["SetValue"](0, 1);
w3["Nodes"]["Item"](1)["SetValue"](0, 1);

если запустить скрипт автоматически, CheckBox' ы отмечаются ?
Какая разница использую я их контрол в их сборке, или вставляю его в свой какой-то класс. Свойства же его я не меняю.


конечно. Отмечаются и отключаются, как и положено
если бы не отмечались, я бы не стал писать

Вот пример кода, который у меня работает

;)

а насчет классов... попробуйте (если есть возможность) проверить этот код с простым приложением и простым контролом. Если заработает - значит класс, который наследуется от treeList и используется в вашем приложении, что-то перекрывает/перегружает. Методы какие-то.
Ну или версии у нас разные и в вашей версии работа с этим контролом должна делаться как-то иначе


Спасиб еще раз за дискуссию...я провел еще один экспиримент. Сохранил свойства объекта своего (целой формы), а потом записал скрипт где отмечаю CheckBox один, а второй наоборот снимаю галку. И в конце сравниваю два объекта...кароче TC говорит, что они одинаковые. Т.е. он не видит получается этих CheckBox вообще
  • 0

#19 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 06 ноября 2007 - 17:35

Глянул на этот XtraTreeList: я так понял, что там всё опирается на columns. То есть, если мы хотим создать ноду с checkbox'ом, то нам придётся добавлять две колонки: колонка с checkbox'ом (объект TreeListColumn) - будет иметь тип RepositoryItemCheckEdit и, собственно, колонка с именем ноды. Если у Вас именно такая реализация (помните, что header'ы колонок могут быть скрыты), то попробуйте поиграть с объектом TreeListColumn (он принадлежит главной форме или панели, смотря на чём лежит дерево... то есть открываете Fields и ищите что-то типо "treeListColumn1"). Если другая, то лучше выложить примерчик, быстрее разберёмся ;)
P.S. У DevExpress'а есть ещё какой-то XtraTreeListBlending, а контрол более старой версии, не имел приставки Xtra (впрочем, это не точно).
  • 0

#20 Cirrus

Cirrus

    Новый участник

  • Members
  • Pip
  • 65 сообщений

Отправлено 06 ноября 2007 - 17:41

Глянул на этот XtraTreeList: я так понял, что там всё опирается на columns. То есть, если мы хотим создать ноду с checkbox'ом, то нам придётся добавлять две колонки: колонка с checkbox'ом (объект TreeListColumn) будет иметь тип RepositoryItemCheckEdit. Если у Вас именно такая реализация, то попробуйте поиграть с объектом TreeListColumn (он принадлежит главной форме или панели, смотря на чём лежит дерево). Если другая, то лучше выложить примерчик, быстрее разберёмся ;)
P.S. У DevExpress'а есть ещё какой-то XtraTreeListBlending, а контрол более старой версии, не имел приставки Xtra (впрочем, это не точно).


Да. Это я уже отметил, что все там на колонках построено...я даже могу получить название филда от одной из колонок :

Log.Message(w3["Columns"]["Item_2"](0).FieldName.OleValue); //это колонка со значением
, а перед этой строчкой на форме стоит чекбокс типа включать / не включать это значение. У колонки с чекбоксами ФилдНэйм отсутствует. Так вот у меня не получилось, через Columns пробиться до CheckBox. Все равно мне кажется что надо как-то делать через [Nodes], хотя вы наверное быстрее меня разберетесь.
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных