AdvancedDataGrid общая сумма узлов ветвления - PullRequest
0 голосов
/ 09 января 2012

Введение: У меня есть AdvancedDataGrid, отображающий иерархические данные, показанные на рисунке ниже: enter image description here

Узлы ветвления "Prosjekt" и "Tiltak" отображают сумму листовых узловниже.

Проблема: Я хочу, чтобы корневой узел "Tavle" отображал общую сумму узлов ветви ниже.Когда я попытался сделать это, добавив тот же SummaryRow, сумма корневого узла была вычислена неправильно (сумма каждого узла была рассчитана дважды).

dg_Teknikktavles = new AutoSizingAdvancedDataGrid();
            dg_Teknikktavles.sortExpertMode="true";
            dg_Teknikktavles.headerHeight = 50;
            dg_Teknikktavles.variableRowHeight = true;

            dg_Teknikktavles.addEventListener(ListEvent.ITEM_CLICK,dg_TeknikktavlesItemClicked);
            dg_Teknikktavles.editable="false";
            dg_Teknikktavles.percentWidth=100;
            dg_Teknikktavles.minColumnWidth =0.8;
            dg_Teknikktavles.height = 1000;
            var sumFieldArray:Array = new Array(context.brukerList.length);

            for(var i:int = 0; i < context.brukerList.length; i++)
            {
            var sumField:SummaryField2 = new SummaryField2();
            sumField.dataField = Ressurstavle.ressursKey + i;
            sumField.summaryOperation = "SUM";
            sumFieldArray[i] = sumField;
            }

            var summaryRow:SummaryRow = new SummaryRow();
            summaryRow.summaryPlacement = "group";
            summaryRow.fields = sumFieldArray;

            var summaryRow2:SummaryRow = new SummaryRow();
            summaryRow2.summaryPlacement = "group";
            summaryRow2.fields = sumFieldArray;

            var groupField1:GroupingField = new GroupingField();
            groupField1.name = "tavle";
            //groupField1.summaries = [summaryRow2];

            var groupField2:GroupingField = new GroupingField();
            groupField2.name = "kategori";
            groupField2.summaries = [summaryRow];
            var group:Grouping = new Grouping();
            group.fields = [groupField1, groupField2];
            var groupCol:GroupingCollection2 = new GroupingCollection2();
            groupCol.source = ressursTavle;
            groupCol.grouping = group;
            groupCol.refresh();

Основной вопрос: Как сделатья получаю корневой узел "Tavle" моего AdvancedDataGrid (dg_Teknikktavles), чтобы правильно отображать сумму двух узлов ветви ниже?

Дополнительный вопрос: Как добавить красный цвет к числамитоговая строка корневого узла, которая превышает 5?Например, столбец, отображающий 8, будет превышать 5 в итоговой строке корневого узла и поэтому должен быть помечен красным

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 10 января 2012

Это общий ответ, без примеров кода, но мне пришлось сделать то же самое всего пару дней назад, так что моя память все еще свежа :) Вот что я сделал:

  1. Создал класс A для представления данных средства визуализации элементов, расширил его из Proxy (у меня были определены имена полей во время выполнения) и позволил ему содержать коллекцию значений в качестве элемента данных. При доступе через flash_proxy::getPropery(fieldName) он найдет соответствующее значение в элементе данных, содержащем значения, и вернет его. Специальное примечание: внедрите IUID, просто сделайте это, это сэкономит вам пару дней разочарования .

  2. Расширенное A в B, добавлено свойство children, содержащее ArrayCollection of A (не пытайтесь экспериментировать с другими типами коллекций, если только вы не хотите исследовать тонны фреймворкового кода, поверьте мне, это уродливо и невозможно идентифицировать как интересное). Пусть B переопределит flash_proxy::getPropery - в зависимости от вашего компилятора это может или не может быть, если не возможно - вызвать некоторую функцию из A.flash_proxy::getPropery(), которую вы можете переопределить в B. Пусть эта функция запрашивает каждый экземпляр A, который является ребенок B, запрашивающий то же самое, что и сам DataGrid, при построении средств визуализации элементов - таким образом вы получите итоговое значение.

  3. При создании провайдера данных. Создайте ArrayCollection of B (опять же, не пытайтесь экспериментировать с другими коллекциями - если вы не готовы к большому разочарованию). Создайте иерархические данные, которые используют эту коллекцию массивов в качестве источника.

Цвета - это то, для чего вы используете средства визуализации элементов, просто посмотрите любой учебник по использованию средств визуализации элементов, который должен быть довольно простым.

0 голосов
/ 10 января 2012

В случае, если у кого-то еще есть такая же проблема:

Первоначальная проблема в том, что все было суммировано дважды, была результатом использования того же массива SummaryField2 ( sumFieldArray в коде) дляоба поля группировки (GropingField2 tavle и kategori )

Решение основного вопроса: заключался в создании нового массива итоговых полей длякорневой узел (в моем первоначальном цикле for):

    //Summary fields for root node
    var sumFieldRoot:SummaryField2 = new SummaryField2();
    sumFieldRoot.dataField = Ressurstavle.ressursKey + i;
    sumFieldRoot.summaryOperation = "SUM";
    sumFieldArrayRoot[i] = sumFieldRoot;

Ответ на дополнительный вопрос: Это было почти так же просто, как указывал wvxyw.Код для этого решения ниже:

        private function summary_styleFunction(data:Object, col:AdvancedDataGridColumn):Object
        {
            var output:Object;
            var field:String = col.dataField; 
            if ( data.children != null )  
            {  
                if(data[field] >5){
                    output = {color:0xFF0000, fontWeight:"bold"}
                }
                else {
                    output = {color:0x006633, fontWeight:"bold"}
                }
                //output = {color:0x081EA6, fontWeight:"bold", fontSize:14}

            }  


            return output;  
        }
...