TreeView PopulateOnDemand
От: Аноним  
Дата: 28.02.07 13:18
Оценка:
Привет.

Использую TreeView control с установленным PopulateOnDemand. Когда открывают узел, подчитываю "детей" из базы и затем отрисовываю.
Проблема в том, что подчитка из базы занимает какое-то время, и получается, что человек нажал на плюсик, и ждет секунд 3-5. Но в это время никакого отклика не видет, и думает, что не ткнул на плюсик.
Как нарисовать что-нибудь на экране, пока данные подчитываются из базы ?
типа как на рсдне появляется "Загрузка, подождите пожалуйста..."
Re: TreeView PopulateOnDemand
От: mogadanez Чехия  
Дата: 28.02.07 16:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>типа как на рсдне появляется "Загрузка, подождите пожалуйста..."


посмотрел я на это дерево первый раз... мда... клиентский API там хиловат

решение в лоб...в конец страницы
пишем

<script>
    var base$TreeView_PopulateNodeDoCallBack = this.TreeView_PopulateNodeDoCallBack;
    var base$TreeView_ProcessNodeData = this.TreeView_ProcessNodeData;
    this.TreeView_ProcessNodeData = function ( result, context )
        {
        alert( "after load " );
        return base$TreeView_ProcessNodeData ( result, context );
        }
    this.TreeView_PopulateNodeDoCallBack = function (context,param)
        {                
        alert( "before load " );
        return base$TreeView_PopulateNodeDoCallBack(context,param)
        }
</script>


ну или через RegisterStartupScript

вместо алертов пишем код отображающий какой нибудь индикатор загрузки.
как я уже сказал клиентское API ущербное, ноду там добавить/удалить низя, поэтому в чистом виде как на рсдн не получится.


вот пример простенькой реализации.

 
 <script>    
    var base$TreeView_PopulateNodeDoCallBack = this.TreeView_PopulateNodeDoCallBack;
    var base$TreeView_ProcessNodeData = this.TreeView_ProcessNodeData;
    this.TreeView_ProcessNodeData = function ( result, context )
        {
        //alert( "after load " );
        hide_wait_for_node( context.node );
        return base$TreeView_ProcessNodeData ( result, context );
        }
    this.TreeView_PopulateNodeDoCallBack = function (context,param)
        {                
        //alert( "before load " );
        show_wait_for_node( context.node );
        return base$TreeView_PopulateNodeDoCallBack(context,param)
        }
        
    function hide_wait_for_node( node )    
        {
        if ( node.wait_img )
            {
            node.removeChild( node.wait_img );
            }
        }
        
    function show_wait_for_node( node )
        {
        var wait_img = document.createElement("IMG" );
        wait_img.src = "loading.gif";           
        wait_img.border = 0;
        node.wait_img = wait_img;
        node.appendChild( wait_img );
        
        } 
</script>



мой хостинг временно не работает
подниму — выложу демо.
а пока скриншот:

... << RSDN@Home 1.2.0 alpha rev. 662>>
Re[2]: TreeView PopulateOnDemand
От: Аноним  
Дата: 01.03.07 10:51
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, <Аноним>, Вы писали:


А>>типа как на рсдне появляется "Загрузка, подождите пожалуйста..."


Супер. Спасибо большое.
А можно ли "подпихнуть" картинку или надпись под родителя ?
Простите за шквал вопросов, но в HTML я лох...
Re[3]: TreeView PopulateOnDemand
От: mogadanez Чехия  
Дата: 01.03.07 11:13
Оценка:
А>>>типа как на рсдне появляется "Загрузка, подождите пожалуйста..."

А>Супер. Спасибо большое.

А>А можно ли "подпихнуть" картинку или надпись под родителя ?
А>Простите за шквал вопросов, но в HTML я лох...

можно, если будет не лень, на выходных сделаю

общая идея — найти нужную ноду от переданного node и добавить туда временного ребенка.
найти ее поможет FF Firebug или IE DOM Inpector
Re[4]: LIVE DEMO
От: mogadanez Чехия  
Дата: 02.03.07 23:16
Оценка: 3 (1)
M>можно, если будет не лень, на выходных сделаю

стало не лень... вот результат:

http://rsdnsamples.poigraem.ru/TreeViewOnDemand/Default.aspx

Forced delay — задержка для эмуляции долгого запроса( мсек )
Re[5]: LIVE DEMO
От: mogadanez Чехия  
Дата: 02.03.07 23:42
Оценка:
M>стало не лень... вот результат:

P.S. только еще наверное стоит менять + на — во время ожидания или на промежуточную иконку, но это уж сами
Re[5]: LIVE DEMO
От: CoolWebDev  
Дата: 05.03.07 12:55
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>>можно, если будет не лень, на выходных сделаю


M>стало не лень... вот результат:


Re[5]: LIVE DEMO
От: mogadanez Чехия  
Дата: 05.03.07 15:24
Оценка:
M>стало не лень... вот результат:

есть конечно баги, например если нажать несколько плюсиков сразу — грузится только последний.
но это я думаю вы и сами поправите.
... << RSDN@Home 1.2.0 alpha rev. 676>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.