1

我正在将 flex 用于应用程序,但我在从其中一列中有复选框的数据网格中恢复数据时遇到了一些麻烦,问题是我不能使用函数 selectedIndex 或 selectedItem,因为它们已被使用保存选中的项目。

有没有办法使用列和行索引来恢复数据网格信息?就像是:

MyDataGrid[row][column] 或 MyDataProvider[row][column] 或任何函数组合,以允许我仅使用行和列来恢复信息。

谢谢

4

2 回答 2

4

如果您只想能够使用行和列索引获取数据网格的单元格值,您可以扩展 DataGrid 组件并添加一个简单的函数。

这是一个工作示例

它看起来像这样:

//自定义数据网格

<?xml version="1.0" encoding="utf-8"?>
<s:DataGrid xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        width="400" height="300">
<fx:Script>
    <![CDATA[
        import spark.components.gridClasses.GridColumn;

        public function getElementAt(row:int, col:int):Object
        {
            if (this.dataProvider.length < row + 1 || this.columns.length < col + 1)
                return null;
            else
                return this.dataProvider.getItemAt(row)[(this.columns.getItemAt(col) as GridColumn).dataField];
        }
    ]]>
</fx:Script>
</s:DataGrid>

然后你在你的应用程序中这样调用它:

//应用程序

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           minWidth="955" minHeight="600" 
           xmlns:dgrc="com.dgrc.*">
<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;

        [Bindable]private var collection:ArrayCollection = new ArrayCollection([
            {fld01:1, fld02:"fld02", fld03:"fld13", fld04:"fld14"},
            {fld01:2, fld02:"fld02", fld03:"fld23", fld04:"fld24"},
            {fld01:3, fld02:"fld02", fld03:"fld33", fld04:"fld34"},
            {fld01:4, fld02:"fld02", fld03:"fld43", fld04:"fld44"},
            {fld01:5, fld02:"fld02", fld03:"fld53", fld04:"fld54"}
        ]);

        protected function getElement():void
        {
            var obj:Object = myDG.getElementAt(nsRow.value, nsCol.value);
            Alert.show(String(obj));
        }

    ]]>
</fx:Script>

<s:VGroup x="20" y="20">

    <s:HGroup>
        <s:NumericStepper id="nsRow" minimum="0" value="0"/>
        <s:NumericStepper id="nsCol" minimum="0" value="0"/>
        <s:Button label="Get It!" click="getElement()"/>
    </s:HGroup>

    <dgrc:CustomDataGrid id="myDG" width="300" height="160" dataProvider="{collection}">
        <dgrc:columns>
            <s:ArrayList>  
                <s:GridColumn dataField="fld01" headerText="Field 1" width="100"/>
                <s:GridColumn dataField="fld03" headerText="Field 3" width="100"/>
                <s:GridColumn dataField="fld04" headerText="Field 4"/>
            </s:ArrayList>                  
        </dgrc:columns> 
    </dgrc:CustomDataGrid>
</s:VGroup>

</s:Application>

请注意,此示例中的 row 和 col 索引引用数据网格的一个单元格,而不是数据网格提供程序的值。

如果你打电话

getElementAt(0, 1)

你会得到“fld13”

于 2013-07-03T14:48:57.333 回答
0

如果您使用的是原始DataGrid控件,最好使用 的itemToLabel方法DataGridColumn,因为item[dataField]当属性值包含点表示法时会导致异常,例如"customer.name"

    public function getElementAt(row:int, col:int):Object {
        var item:Object = dataProvider.getItemAt(row)
        var column:DataGridColumn = dataGrid.columns[column] as DataGridColumn;
        var value:String = column.itemToLabel(item);
        return value;
    }

框架使用相同的方法来提供显示在网格单元格中的文本。如果您在网格中的复选框由布尔属性驱动,则返回值将为truefalse

于 2016-05-24T01:50:50.150 回答