0

私はデータグリッドとスパークに慣れていないので、これを理解するために頭を悩ませています。XMLList を使用してロードされているデータグリッドがあります。1 つのフィールドは、別のフィールドで計算される数値であり、その結果はその場でグリッドに格納および表示されます。

例:

XML

<SampleTable>
 <Row>
  <Item>Item 1</Item>
  <Quantity>10</Quantity>
  <Price></Price>
  <Cost></Cost>
 </Row>
</SampleTable>

したがって、ユーザーが価格を入力すると、価格 * 数量の値でコストがグリッドで更新され、フォームが保存されたときにデータプロバイダーが結果で更新されます。

グリッドに追加すると、XML は既にバインドされています。セルを機能させるための簡単な更新を取得できます。計算をどこで行うべきかを理解するのに助けが必要です。価格のみが編集可能で、そのセルの値が変更されたときにコストを計算したいと考えています。

編集セッションのハンドラー:

        import spark.components.gridClasses.CellPosition;
        import spark.events.GridEvent;
        private var mouseDownRowIndex:int;
        private var mouseDownColumnIndex:int;
        protected function dataGrid_gridMouseDownHandler(event:GridEvent):void
        {
            mouseDownRowIndex = event.rowIndex;
            mouseDownColumnIndex = event.columnIndex;
        }

        protected function dataGrid_gridMouseUpHandler(event:GridEvent):void
        {
            // Start a grid item editor if:
            // - the rowIndex is valid
            // - mouseUp is on the same cell and mouseDown
            // - shift and ctrl keys are not down
            // - cell is editable
            // - an editor is not already running
            // An editor may already be running if the cell was already
            // selected and the data grid started the editor.
            if (event.rowIndex >= 0 &&
                event.rowIndex == mouseDownRowIndex && 
                event.columnIndex == mouseDownColumnIndex &&
                !(event.shiftKey || event.ctrlKey) &&
                event.column.editable &&
                !event.grid.dataGrid.itemEditorInstance)
            {
                event.grid.dataGrid.startItemEditorSession(event.rowIndex, event.columnIndex);
            }
        }

<s:DataGrid id="dgTest" x="10" y="68" width="900" editable="true" electionMode="singleCell" requestedRowCount="4"                   gridMouseDown="dataGrid_gridMouseDownHandler(event)" gridMouseUp="dataGrid_gridMouseUpHandler(event)">
<s:columns>
<s:ArrayList>
<s:GridColumn width="250" dataField="Item" headerText="Item" resizable="true" sortable="false" editable="false"></s:GridColumn>
<s:GridColumn width="160" dataField="Quantity" headerText="Quantity" resizable="false" sortable="false" editable="false"></s:GridColumn>
<s:GridColumn width="90" dataField="Price" headerText="Price" resizable="false" sortable="false" ></s:GridColumn>
<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false" sortable="false" editable="false"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
4

3 に答える 3

0

Datagridは、GridItemRendererではなく、データソースの所有者です。したがって、mouseDownEventsは使用しないでください。(セルをタブトラフするとどうなりますか?)この種のビジネスロジックをビューからコントローラー(またはモデル)に移動することを検討することもできます。

あなたの例では、あなたは本当に「派手な」GridItemRendererを必要としません。すべてはデータグリッドの外部で計算する必要があります。

Spark Datagridには、「gridItemEditorSessionSave」と呼ばれるイベントがあります。

spark.components.DataGrid.gridItemEditorSessionSave

アイテムエディタのデータがデータプロバイダに保存され、エディタが閉じられた後にディスパッチされます。

イベントタイプ: spark.events.GridItemEditorEvent.GRID_ITEM_EDITOR_SESSION_SAVE

言語バージョン: 3.0

プレーヤーバージョン: Flash 10、AIR 2.5

製品バージョン: Flex 4.5

個人的には、Bindable ValueObjectを実装し、XMLListをIList実装、たとえば、それらのオブジェクトのセットを含むArrayCollectionに変換します。例は次のとおりです。

[Bindable]
public class MyValueObject
{
   public var percentComplete:Number;
   public var weight:Number;

   public function get extension():Number
   {
      return percentComplete*weight;
   }
}

データグリッドにこれらのValueObjectsを設定すると、ダムビューを使用でき、さらに良いことに、実際のアプリケーションを変更することなく、好きなビューを使用できます。(それがオブジェクト指向プログラミングの目的ではありませんか?)

ただし、この質問は最初の質問とはまったく異なります。私は喜んで答えを提供しますが、あなたはあなた自身でいくつかの研究をするべきです。

于 2012-08-16T07:56:30.617 に答える
0

itemrendererを使用して動作しました。それは醜いですが、動作します。

私が問題を抱えているのは、このフィールドのクリックイベントではなく、PercentCompleteフィールドが変更されたときにこのイベントを移動することです。これは私が問題を抱えているタイミングです。

                <s:GridColumn width="90" dataField="Extension" headerText="Extension" resizable="false" sortable="false" rendererIsEditable="true">
                    <s:itemRenderer>
                        <fx:Component>
                            <s:GridItemRenderer mouseDown="itemrenderer1_dataChangeHandler(event)">
                                <fx:Script>
                                    <![CDATA[
                                        import mx.events.FlexEvent;
                                        import spark.events.GridEvent;

                                        protected function itemrenderer1_dataChangeHandler(event):void
                                        {

                                            if(data){
                                                var data_field:String = ((parseFloat(data['PercentComplete'])/100)*parseFloat(data['Weight'])).toFixed(2).toString();
                                                this.dataLabel.text = data_field;
                                                data.Extension[0] = data_field;
                                            }
                                        }
                                    ]]>
                                </fx:Script>
                                <s:Label id="dataLabel" text="{data.Extension}" height="100%" width="100%" textAlign="left" verticalAlign="middle"/>

                            </s:GridItemRenderer>
                        </fx:Component>
                    </s:itemRenderer>
                </s:GridColumn>
于 2012-08-15T21:45:19.190 に答える
0

データソースをバインド可能にする必要があります。

したがって、コード(AS)では、これは次のようになります。

[Bindable]
var myXMLList:XMLList;

ただし、XMLListにバインドすることはできないと思います。代わりにXMLListCollectionを使用する必要があります。

データをどこかに保存したいのか、それとも単に視覚化したいのかはまだわかりません...

s:GridColumnには、「labelFunction」というプロパティがあります。多分これはあなたのニーズには十分です。

public function myLabelFunction(item:Object, column:DataGridColumn):String
{
    var amount:Number = item.Quantiy;
    var price:Number = item.Price;
    return amount*price as String
}

あなたの例では

<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false"  sortable="false" editable="false"></s:GridColumn>

に変更されます

<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false"  sortable="false" editable="false" labelFunction="myLabelFunction"></s:GridColumn>

提供されたコードは決して完全ではありません。例として役立ちます。

幸運を。

于 2012-08-14T13:55:50.213 に答える