2012-01-09 5 views
0

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

узлы ветвления «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(); 

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

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

Заранее благодарен!

ответ

0

В случае, если кто-то имеет такую ​​же проблему:

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

Решение на главный вопрос: было создать новый массив summaryfields для корневого узла (в моем intial для цикла):

//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; 
     } 
1

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

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

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

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

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

+0

Благодарим за помощь и хороший ответ! Я нашел решение своей проблемы (для получения дополнительной информации прочитайте мой ответ). Решение было немного проще, чем я ожидал: p – Sebastian

Смежные вопросы