Как я могу заставить AdvancedDataGridRenderProviderer отображать ArrayCollection? - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть объект, который выглядит так:

[Bindable]
public class MyRecord implements ValueObject
{

    public var recall_id:int;
    public var recall_type:String;
    public var selected:Boolean = false;
    public var qty:Number;
    public var curr_qty:Number;
    public var due_date:String;
    public var status:String;
    public var comments:String;
    public var groupedTrades:ArrayCollection = new ArrayCollection();
}

Я помещаю кучу таких в ArrayCollection, а затем использую это как dataProvider для AdvancedDataGrid:

<mx:dataProvider>       

                                <mx:HierarchicalData 
                                    source="{model.recalls}"
                                    childrenField="groupedTrades"/>      

                            </mx:dataProvider>

У меня есть AdvancedDataGridRenderProvider, для которого я хочу отобразить мои «групповые сделки»:

<mx:rendererProviders>

                                <mx:AdvancedDataGridRendererProvider 
                                    depth="2" 
                                    columnIndex="1" 
                                    renderer="com.controls.GroupedTradesGrid"
                                    columnSpan="0"/>

                            </mx:rendererProviders> 

В этом renderProvider я переопределяю функцию set data для установки dataProvider:

override public function set data(value:Object):void
        {
            // If using the array data source, use this instead:
            trades_dg.dataProvider = value;
        }

Проблема в том, что метод renderProvider вызывается для каждой записи в dataProvider ADG, частью которой он является. Это равносильно новому DataGrid для каждой сделки в groupedTrades.

Как мне решить эту проблему? Я в замешательстве.

Спасибо за полезные советы и с Днем Благодарения!

ОБНОВЛЕНИЕ: я только что нашел какой-то жестко заданный массив из блога, который делает то, что я хочу; DataGrid как renderProvider для AdvancedDataGrid.

private var masterData:Array = [
        { OrderId: 10248, CustomerId:"WILMK", EmployeeId:5, OrderDate:"1-Feb-2007", 
        children:[
                [
                    {ProductId:11, ProductName:"Quesbo Cabrales", UnitPrice:14, Quantity:12, Discount:0, Price:168},
                    {ProductId:42, ProductName:"Singaporean Hokkien Fried Mee", UnitPrice:9.8, Quantity:10, Discount:0, Price:98},
                    {ProductId:42, ProductName:"Mozzarella di Giovanni", UnitPrice:34.8, Quantity:5, Discount:0, Price:174}
                ]
                ]}
             ]
         ]}

Это из этого блога: http://techrays.wordpress.com/2008/04/07/advanced-datagrid-as-an-item-renderer-within-an-advanced-datagrid/#comment-1511

Когда я отлаживаю свою коллекцию (напоминает коллекцию массивов, которую я использую), когда она возвращается с сервера, я вижу что-то вроде этого:

вызывает [0] - объект RecallRecord - опора - опора - groupedTrades - ArrayCollection, которую я хочу использовать в качестве DP для renderProvider groupedTrades [0] - Общий объект groupedTrades [1] - Общий объект

Я не вижу разницы между жестко закодированной версией из блога, которая работает, и данными, которые я использую из своего сервиса. Что мне не хватает?

спасибо!

1 Ответ

0 голосов
/ 01 декабря 2011

РЕШИТЬ:

Оказывается, проблема была в том, как я назначил значения для groupedTrades, когда сервер ответил. Я делал это совершенно неправильно: я делал прямое назначение вместо добавления ArrayCollection в качестве элемента к ArrayCollection 'groupedTrades'.

Я делал это:

for ( var i:int=0;i<result.length;i++ ){
                var item:Object = result[i];

                var recall:RecallRecord       = new RecallRecord();
                recall.counterparty_shortcode = item.counterparty_shortcode;
                recall.comments               = item.comments;
                recall.curr_qty               = item.curr_qty;
                recall.div_percent            = item.div_percent;
                recall.due_date               = df.format( item.due_date );
                recall.qty                    = item.qty;
                recall.rebate_rate            = item.rebate_rate;
                recall.recall_id              = item.recall_id;
                recall.recall_type            = item.recall_type;
                recall.sedol                  = item.sedol;
                recall.status                 = item.status;
                recall.ticker                 = item.ticker;
                recall.groupedTrades          = item.groupedTrades;


                model.recalls.addItem( recall );
            }

Вместо этого:

for ( var i:int=0;i<result.length;i++ ){
                var item:Object = result[i];

                var recall:RecallRecord       = new RecallRecord();
                recall.counterparty_shortcode = item.counterparty_shortcode;
                recall.comments               = item.comments;
                recall.curr_qty               = item.curr_qty;
                recall.div_percent            = item.div_percent;
                recall.due_date               = df.format( item.due_date );
                recall.qty                    = item.qty;
                recall.rebate_rate            = item.rebate_rate;
                recall.recall_id              = item.recall_id;
                recall.recall_type            = item.recall_type;
                recall.sedol                  = item.sedol;
                recall.status                 = item.status;
                recall.ticker                 = item.ticker;

                recall.groupedTrades.addItem( item.groupedTrades );

                model.recalls.addItem( recall );
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...