Temat: Refresh/reload Datagrid'a

Witam,

Jak odświeżyć datagrida ? po wypełnieniu formularza dane zapisywane są do bazy danych, lecz w datagrindzie dane te pojawiają się z opóźnieniem, chciałbym do tego podpiąć buttoma, lub cos w ten deseń, aby odświeżyć, przeładować datagrind’a.
Pragnę podkreślić ze dane się pojawiają ale nie od razu po uzupełnieniu formularza, poniżej kod.

List.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:HTTPService id="srv" url="addform.php" method="POST">
<mx:request>
<first>{first.text}</first>
<last>{last.text}</last>
<email>{email.text}</email>
</mx:request>
</mx:HTTPService>

<mx:XML id="mydata" source="http://localhost/flex/List-debug/list.php"></mx:XML>

<mx:DataGrid id="emaillist" x="10" y="10" dataProvider="{mydata..subscriber}" width="720" height="186">
<mx:columns>
<mx:DataGridColumn headerText="Name" dataField="first" />
<mx:DataGridColumn headerText="Surrname" dataField="last" />
<mx:DataGridColumn headerText="Mail" dataField="email" />
<mx:DataGridColumn id="opcje" dataField="Opcje" visible="false" />
</mx:columns>

</mx:DataGrid>
<mx:Button x="10" y="204" label="Dodaj" width="88" click="currentState='Add'" id="button1"/>
<mx:Button x="106" y="204" label="Hide" click="opcje.visible = !opcje.visible;" />
<mx:Label x="204" y="206" text="{emaillist.selectedItem.first}"/>
<mx:Label x="204" y="232" text="{emaillist.selectedItem.last}"/>
<mx:Label x="204" y="258" text="{emaillist.selectedItem.email}"/>


<mx:TextInput id="first" x="371" y="204"/>
<mx:TextInput id="last" x="371" y="234"/>
<mx:TextInput id="email" x="371" y="264"/>

<mx:Button x="371" y="294" label="Dodaj" click="srv.send()"/>

</mx:Application>


list.php

<?php
header('Content-Type: text/xml');
?>
<subscribers>
<?php
include('DB.php');


$sql="SELECT * FROM emails";
$querty=mysql_query($sql);
while($list=mysql_fetch_array($querty))
{
?>
<subscriber>
<first><?php echo( $list['first'] ); ?></first>
<last><?php echo( $list['last'] ); ?></last>
<email><?php echo( $list['email'] ); ?></email>
</subscriber>
<?php
}
?>
</subscribers>


addform.php

<?php
header('Content-Type: text/xml');
include('DB.php');

$first = $_POST['first'];
$last = $_POST['last'];
$email = $_POST['email'];

$sql = "INSERT INTO emails (first, last, email) VALUES ('$first', '$last', '$email')";
$query = mysql_query($sql);


?>
Piotr Kubasiak

Piotr Kubasiak Flex developer

Temat: Refresh/reload Datagrid'a

Po pierwsze to powinieneś dane trzymać w modelu (najlepiej w singletonie) wtedy nie było by problemu z odświeżeniem.
W tym wypadku musisz po ściągnięciu danych przypisać jeszcze raz dataProvider do datagrida i będzie się odświeżać natychmiast.

Musisz zrobić :
1. do srv napisać result handlera w nim napisać wysłać zapytanie do bazy by ściągąć dane.
2. do servisu ściągającego dane także napisać result handlera i w nim przypisanie result.event do datagrid.dataprovider.

W obecnej formie to w ogóle jest źle zaimplementowane i dane z pobranego xml ściągną się tylko raz podczas uruchomienia aplikacji.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Refresh/reload Datagrid'a

Chciałbym zauważyć, że kolega słusznie podkreślił, że obiekt HTTPService ma eventa o nazwie result. Tylko chciałem komentarz dodać żeby nie było niejasności.

Kiedy skontaktujesz się z serwerem na .../addform.php to ten może odesłać Ci do obiektu HTTPService od razu odpowiedź z gotową listą w formacie XML (lub czymkolwiek co datagrid jest w stanie przetworzyć). Musisz wołaną funkcją PHP zwrócić stringa w postaci XML, lub JSON.

Polecam JSON. XML-e są wielkie i nieporęczne do przesyłania przez sieć.
Można JSON-a przerobić na Array, tą z kolei przerobić na ArrayCollection i podpiąć bezpośrednio jako dataprovider-a

Przykład dla wyniku przesłanego w formacie JSON (z pamięci):

//w obsłudze eventa result obiektu HTTPService
var array : Array = JSON.decode(event.result) as Array;
var arrayCollection : ArrayCollection = new ArrayCollection(array);
datagrid.dataprovider = arrayCollection;


Ja preferuje raczej mieć ArrayCollection zapisane jako tag i zbindowane na stałe z datagrid.dataprovider. Uwaga, jak bindujesz to nie przypisujesz arrayCollection do dataprovidera po załadowaniu nowych danych do arrayCollection.

Chciałbym zauważyć, że ten sposób nie wymaga ponownego skontaktowania się z bazą danych/serwerem. Po prostu dane wpisane w formularzu zapisujesz do bazy, odczytujesz z bazy nowo-otrzymaną listę i odsyłasz jako wynik funkcji zakodowaną w formacie JSON. Jednym połączeniem rozwiązujesz cały problem.

pseudokod

WriteDataIntoDataBase(formData);
list = GetDataFromDataBase();
json = ConvertListToJson(list);
return json;
Borysław Bobulski edytował(a) ten post dnia 26.11.11 o godzinie 01:41
Michał Grzegorzewski

Michał Grzegorzewski Adobe Flexpert i
właściciel firmy -
RIA-Develop

Temat: Refresh/reload Datagrid'a

Zachęcam do zapoznania z tym przykładem
http://livedocs.adobe.com/flex/3/html/help.html?conten...

Następna dyskusja:

Zaznaczanie wiersza w datagrid




Wyślij zaproszenie do