Просмотр полной версии : Иерархический сорт
Apikaster
10.08.2011, 15:26
Доброе время суток друзья ...
У меня проблема ...
Сделал иерархическое дерево в адвансед дата гриде ...
Написал к нему сорт ... (вписываете слово в текст филд, и если слово таковое есть то он чтобы его находил)
Чтобы он внутри иерархий искал вписанный в текст филд слово ...
И обрывался при нахождение такого слова (вписанного в текст филде) ... (беик)
Но проблема встала в следующем ...
Он нашел ... И сработал брейк ... Таблица вся открылась ...
Но теперь как сделать так чтобы он перешел на тот объект который найден (у которого текст в гриде соответствует вписанному в текс филде слову)?
И чтобы пользователь понял что вписанный объект найден и видел что он выбран ...
Я использовал в начале другой сорт но он убирал все другие записи и находил именно одну или несколько которые соответствует вписанному слову в текст филде , но таковой вариант их не устроил ...
А так данная таблица раскрывается и где то внизу с прокруткой можно найти соответствие ...
Помогите ... Прошу ... А то я уже измучился с этой задачей ...
Apikaster, поменьше эмоций, больше внятной речи. Точка пишется так ".", а не так "...". Пробел ставиться после запятой, а не перед.
(беик)
Внутренние звуки вашего организма, тоже малоинформативны.
У AdvancedDataGrid есть свойство selectedItem, сортировка тут, вообще к делу не относится.
Apikaster
11.08.2011, 09:41
Apikaster, поменьше эмоций, больше внятной речи. Точка пишется так ".", а не так "...". Пробел ставиться после запятой, а не перед.
Внутренние звуки вашего организма, тоже малоинформативны.
У AdvancedDataGrid есть свойство selectedItem, сортировка тут, вообще к делу не относится.
Благодарю.
Давайте я вам попробую объяснить.
В гриде у меня есть столбец нейм. И по нему я ищу соответствующее наименование.
Как думаете? Надо сначала найти индекс, и после поставить на него селектед индекс?
Или найти сам искомый элемент и использовать 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.
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 минут
Но у меня двойной сорт.
В массиве у меня есть поле парент и поле айди.
И иерархия у меня строиться по паренту и айди.
Так что мне этот метод не прокатит.
Придется делать просто подуровневый аррей.
И с него искать.
Сортировка не важна. Это были рудименты, не относящиеся к поиску. Я их удалил.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.