XML связанный вопрос в flex - PullRequest
       7

XML связанный вопрос в flex

0 голосов
/ 19 апреля 2011

Мой xml выглядит так:

<node label=home>
  <node label="1.0" >
    <node label="1.1">
      <node label="1.1.1">
        <node label="1.1.1.1"/>
        <node label="1.1.1.2"/>
      </node>
      <node label="1.1.2"/>
      <node label="1.1.3"/>
    </node>
    <node label="1.2"/>
    <node label="1.3">
      <node label="1.3.1"/>
      <node label="1.3.2"/>
    </node>

  </node>
  <node label="2.0"/>
</node>

В моей таблице данных есть 4 столбца.
1-й столбец должен получать только данные, которые имеют размеры 1,0 и 2,0. 2-й столбец должен получить данные как 1.1.
3-й столб как 1.1.1.
4-й столбец как 1.1.1.1, и так далее.

Есть идеи, как мне это сделать?

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Прежде всего, не должен ли узел "2.0" находиться на том же уровне, что и узел "1.0"? (В вашем примере узел "2.0" находится внутри узла "1.0").

Во-вторых, я не уверен, что это то, что вы ищете, но попробуйте этот пример приложения и дайте мне знать, если это поможет.

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                width="100%"
                height="100%">

    <mx:Script>
    <![CDATA[
        private function labelBuilder(item:Object, column:DataGridColumn):String {
            var ref:Object = this.deriveComplexColumnData(item, column.dataField);
            var label:String = "";
            for (var r:String in ref) {
                label += ref[r] + "; ";
            }
            return label;
        }

        private function deriveComplexColumnData(data:Object, dataField:String):Object {
            var currentRef:Object = data;
            var tokens:Array = dataField.split('.');
            if (tokens.length > 0) {
                for (var i:int = 0; i < tokens.length; i++)
                    currentRef = currentRef[tokens[i]];
            }
            return currentRef;
        }
        ]]>
    </mx:Script>

    <mx:XML id="xml">
        <node label="home">
            <node label="1.0">
                <node label="1.1">
                    <node label="1.1.1">
                        <node label="1.1.1.1"/>
                        <node label="1.1.1.2"/>
                    </node>
                    <node label="1.1.2"/>
                    <node label="1.1.3"/>
                </node>
                <node label="1.2"/>
                <node label="1.3">
                    <node label="1.3.1"/>
                    <node label="1.3.2"/>
                </node>
            </node>
            <node label="2.0"/>
        </node>
    </mx:XML>

    <mx:DataGrid id="dg" width="100%" height="100%" dataProvider="{xml.node}">
        <mx:columns>
            <mx:DataGridColumn dataField="@label" headerText="Node1"/>
            <mx:DataGridColumn dataField="node.@label" headerText="Node2"/>
            <mx:DataGridColumn dataField="node.node.@label" headerText="Node3"/>
            <mx:DataGridColumn dataField="node.node.node.@label" labelFunction="{ labelBuilder }" headerText="Node4"/>
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

Обратите внимание на «dataField» в каждом DataGridColum, каждом «узле». представляет 1 уровень глубины внутри XML.

Я также добавил метод labelBuilder, чтобы помочь вам понять, как обрабатываются данные и как вы можете изменить способ их отображения.

0 голосов
/ 20 апреля 2011

Вы хотите поместить эти узлы в сетку на основе их уровня в xml - уровень N переходит в столбец N. Вы можете определить этот уровень, посчитав родителей до нуля:

public static function getNestLevel(node:XML):int {
    var level:int = 0;
    while (node.parent()) {
        level++;
        node = node.parent();
    }
    return level;
}

Я думаю, вам нужно подготовить структуру данных для вашей сетки и поместить туда узлы, используя их уровни. Ты ничего не сказал о рядах. Вы хотите, чтобы каждая строка, как 1.0 | 1.1 | 1.1.1 или каждый узел в другой строке?

0 голосов
/ 20 апреля 2011

использовать форматеры .....

<mx:Script>
    <![CDATA[

        // Event handler to format the input.            
        private function Format():void
        {
            // The format() method returns the formatted String,
            // or an empty String if there is an error.
            var formattedVal:String = numberFormatter.format(inputVal.text);

            if (formattedVal.length==0) {
                // If there is an error, the Format.error property 
                // contains the reason.
                formattedNumber.text=numberFormatter.error;
            }

            else {
                formattedNumber.text=formattedVal;
            }
        }
    ]]>
</mx:Script>

<mx:NumberFormatter id="numberFormatter"/>

<mx:Panel title="NumberFormatter Example" width="75%" height="75%" 
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">

    <mx:Form>
        <mx:FormItem label="Enter number - a letter is invalid:">
            <mx:TextInput id="inputVal" text="" width="75%"/>
        </mx:FormItem>

        <mx:FormItem label="Formatted number: ">
            <mx:TextInput id="formattedNumber" editable="false" width="75%"/>
        </mx:FormItem>

        <mx:FormItem>
            <mx:Button label="Validate and Format" click="Format();"/>
        </mx:FormItem>
    </mx:Form>

</mx:Panel>

Надеюсь, этого будет достаточно :-) Вы можете получить представление об этом и изменить его для вашего требования .... cya!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...