PDA

Просмотр полной версии : Иерархический сорт


Apikaster
10.08.2011, 15:26
Доброе время суток друзья ...
У меня проблема ...
Сделал иерархическое дерево в адвансед дата гриде ...
Написал к нему сорт ... (вписываете слово в текст филд, и если слово таковое есть то он чтобы его находил)
Чтобы он внутри иерархий искал вписанный в текст филд слово ...
И обрывался при нахождение такого слова (вписанного в текст филде) ... (беик)
Но проблема встала в следующем ...
Он нашел ... И сработал брейк ... Таблица вся открылась ...
Но теперь как сделать так чтобы он перешел на тот объект который найден (у которого текст в гриде соответствует вписанному в текс филде слову)?
И чтобы пользователь понял что вписанный объект найден и видел что он выбран ...
Я использовал в начале другой сорт но он убирал все другие записи и находил именно одну или несколько которые соответствует вписанному слову в текст филде , но таковой вариант их не устроил ...
А так данная таблица раскрывается и где то внизу с прокруткой можно найти соответствие ...
Помогите ... Прошу ... А то я уже измучился с этой задачей ...

alatar
10.08.2011, 17:14
Apikaster, поменьше эмоций, больше внятной речи. Точка пишется так ".", а не так "...". Пробел ставиться после запятой, а не перед.
(беик)
Внутренние звуки вашего организма, тоже малоинформативны.

У AdvancedDataGrid есть свойство selectedItem, сортировка тут, вообще к делу не относится.

Apikaster
11.08.2011, 09:41
Apikaster, поменьше эмоций, больше внятной речи. Точка пишется так ".", а не так "...". Пробел ставиться после запятой, а не перед.

Внутренние звуки вашего организма, тоже малоинформативны.

У AdvancedDataGrid есть свойство selectedItem, сортировка тут, вообще к делу не относится.

Благодарю.
Давайте я вам попробую объяснить.
В гриде у меня есть столбец нейм. И по нему я ищу соответствующее наименование.
Как думаете? Надо сначала найти индекс, и после поставить на него селектед индекс?

alatar
11.08.2011, 12:02
Или найти сам искомый элемент и использовать selectedItem или найти его индекс и использовать selectedIndex.

Apikaster
11.08.2011, 13:51
Я пробовал найти индекс. Но как видно иерархическая таблица не понимает понятия selectedIndex. А selectedItem почему то не переходит. Я использовал понятие курсор, чтобы искать внутри иерархической таблицы. Может из-за этого?

protected function findObjName(s:String):void{
var sort:Sort = new Sort();
var f:Boolean;
var s1:String;
var curs:IHierarchicalCollectionViewCursor;
sort.fields = [new SortField("Name")];
dpOhdORUCHV.sort = sort;
ADG.expandAll();
curs = HierarchicalCollectionViewCursor(dpOhdORUCHV.createCursor());
ADG.hierarchicalCollectionView = dpOhdORUCHV;

trace("start search");
while (curs.current){
s1 = curs.current.Name;
//trace("find = " + s1);
//trace("find = " + curORUC.);
if ( s1.match(s) != null){
trace("find = " + s1);
//curs.seek(CursorBookmark.CURRENT);
break;
}
curs.moveNext();
}
}

Методу findObjName передается то слово вписанное в TextInput.
ADG это у меня AdvancedDataGrid.

alatar
11.08.2011, 18:46
1. Курсор ищет только в открытых ветках.
2. selectedItem и selectedIndex выделяют элемент, только в открытых ветках.

Вот пример рекурсивного поиска по иерархическим данным.

<?xml version="1.0" encoding="utf-8"?>
<s:Application name="Hierarchical Search"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.HierarchicalCollectionView;
import mx.collections.HierarchicalData;
import mx.collections.ICollectionView;
import mx.collections.IViewCursor;

private var _data:HierarchicalCollectionView;

private function get data():HierarchicalCollectionView
{
if (!_data)
{
var dataSource:ArrayCollection = new ArrayCollection([
{label:"first", children: (new ArrayCollection([{label: "sub1"}, {label: "sub2"}]))},
{label:"second", children: (new ArrayCollection([{label: "sub1"}, {label: "sub2"}]))}
]);

var hd:HierarchicalData = new HierarchicalData(dataSource);
var hcv:HierarchicalCollectionView = new HierarchicalCollectionView(hd);
_data = hcv;
}

return _data;
}

protected function searchButton_clickHandler(event:MouseEvent):void
{
if (searchInput.text != '')
{
var regexp:RegExp = new RegExp(searchInput.text, "i");
var path:Array = findPath(regexp, data);

if (path)
{
while (path.length != 1)
{
//открываем все ветви до искомого элемента
dg.expandItem(path.shift(), true);
}

//выделяем искомый элемент
dg.selectedItem = path.shift();
}
}
}


/**
* Ищет путь до искомого элемента
*
* @param regexp регулярное выражение для label
*
* @param collection коллекция вида
* <code>var dataSource:ArrayCollection = new ArrayCollection([
* {label:"first", children: (new ArrayCollection([{label: "sub1"}, {label: "sub2"}]))},
* {label:"second", children: (new ArrayCollection([{label: "sub1"}, {label: "sub2"}]))}
* ]);</code>
*
* @return массив вида [parent, parent, item]
*/
private function findPath(regexp:RegExp, collection:ICollectionView):Array
{
var cursor:IViewCursor = collection.createCursor();

if (!cursor.afterLast)
{
do
{
var item:Object = cursor.current;

if (regexp.test(item.label))
{
return [item];
}

if (item.hasOwnProperty("children") && item.children is ICollectionView)
{
var child:Array = findPath(regexp, item.children);

if (child)
{
return [item].concat(child);
}
}
}
while (cursor.moveNext());
}
return null;
}
]]>
</fx:Script>

<s:layout>
<s:VerticalLayout/>
</s:layout>

<s:HGroup>
<s:TextInput id="searchInput"/>
<s:Button id="searchButton" label="search" click="searchButton_clickHandler(event)"/>
</s:HGroup>
<mx:AdvancedDataGrid id="dg" dataProvider="{data}" width="100%" height="100%">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="label"/>
</mx:columns>
</mx:AdvancedDataGrid>
</s:Application>

Apikaster
19.08.2011, 17:38
Благодарю за исходник...

Добавлено через 69 часов 35 минут
Но у меня двойной сорт.
В массиве у меня есть поле парент и поле айди.
И иерархия у меня строиться по паренту и айди.
Так что мне этот метод не прокатит.
Придется делать просто подуровневый аррей.
И с него искать.

alatar
22.08.2011, 15:19
Сортировка не важна. Это были рудименты, не относящиеся к поиску. Я их удалил.