Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Flex > dataProvider для DataGrid


Автор: Alix 16.5.2008, 11:49
Есть такое "приложение":
Код
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
     backgroundGradientColors="[#FFFFFF, #00608D]"
     horizontalAlign="left"
     verticalGap="15" horizontalGap="15"  backgroundGradientAlphas="[1.0, 1.0]" layout="absolute">
    <mx:DataGrid width="352" height="505" x="24" y="47" editable="false" id="myGrid">
        <mx:columns>
            <mx:DataGridColumn headerText="Дата" dataField="choiseDate" width="150"/>
            <mx:DataGridColumn headerText="Выбор" dataField="choiseDecision" width="50"/>
        </mx:columns>
        <mx:dataProvider/>
    </mx:DataGrid>
    <mx:Button x="384" y="48" label="Сделать выбор" width="136" click="onButtonClick()"/>
    
    <mx:Script>
<![CDATA[
    import mx.events.CloseEvent;
    import mx.controls.Alert;
    

    private function onButtonClick():void{
     Alert.show("Превед, медвед?", "Вопросик", Alert.YES | Alert.NO, this, alertClickHandler);
    }
    
    private function alertClickHandler(event:CloseEvent):void{
     myGrid.dataProvider.addItem({choiseDate:new Date(), choiseDecision:event.detail == Alert.YES ? "YES" : "NO"});
    }
]]>
</mx:Script>

    <mx:Label x="24" y="21" text="Choise Log:" fontWeight="bold"/>
     
</mx:Application>

Если нажать на кнопку, и выбрать любой вариант в появившемся Alert'e, то в DataGrid добавится строка с указанием выбора. Проблема в том, что добавится она на вторую позицию (т.е. с индексом 1). Я так понимаю, что это из-за кривого определения dataProvider выше по коду. Но как его тогда правильно объявить?

Честно говоря, впервые юзаю Flex - и эта прога - мой хелло ворлд. Сделать такое же во Flash - без проблем, а тут не получается. И вообще странная фигня, я использую Flex Builder 3 и когда пишу "myGrid.dataProvider.", подсказки по методам не появляется. И в хелпе ничего нет. Приходится лазать в хелп Flash IDE за справками.

Автор: Delite 17.5.2008, 16:24
А зачем dataProvider там вобще описан?

Обычно делается так:

Код

<mx:Script>
  [Bindable] private var data_:Array = [];
</mx:Script>

<mx:DataGrid ... dataProvider="{data_}">
  ...
</mx:DataGrid>


dataProvider - в общем случае это Object. Поэтому никаких подсказок от Flex'а ждать не стоит... а Object он потому что в качестве него можно использовать объекты разных типов, Object, Array, ArrayCollection, XML, XMLList, String и др.

Автор: Alix 17.5.2008, 16:57
Object... ну ясно, во флеше то там это вполне даже класс DataProvider.
Ну суть идеи вашей я уловил, а как заставить это работать? Вот в приведенном выше коде я заменил тело функции alertClickHandler на такое:
Код
    private function alertClickHandler(event:CloseEvent):void{
     data_.push({choiseDate:new Date(), choiseDecision:event.detail == Alert.YES ? "YES" : "NO"});
    }
Массив меняется, а в таблице ничего не происходит. Какой должен быть элемент в этом массиве?

Автор: Delite 17.5.2008, 19:50
Есть такая вешь как data binding, т.е. при изменения данных будут посылаться события всем кто хочет знать об этих изменениях. Так вот Array ничего не посылает при своей модификации. Для этого есть оберкта над ним ArrayCollection, он будет посылать события при изменении порядка, и количества элементов.

Т.о. сделать так:
Код

<mx:Script>
  [Bindable] private var data_:ArrayCollection = new ArrayCollection();

  private function alertClickHandler(event:CloseEvent):void{
    data_.addItem({choiseDate:new Date(), choiseDecision:event.detail == Alert.YES ? "YES" : "NO"});
  }
</mx:Script>
<mx:DataGrid ... dataProvider="{data_}">
  ...
</mx:DataGrid>


(в массиве все что угодно может лежать, т.к. там тоже Object'ы)

Автор: eternalko 11.7.2008, 18:49
Код

<mx:Script>
  [Bindable] private var data_:ArrayCollection = new ArrayCollection();

  private function alertClickHandler(event:CloseEvent):void{
    data_.addItem({choiseDate:new Date(), choiseDecision:event.detail == Alert.YES ? "YES" : "NO"});
    [color=crimson]data_.refresh();[/color]
  }
</mx:Script>
<mx:DataGrid ... dataProvider="{data_}">
  ...
</mx:DataGrid>


Вот так вроде самое то будет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)