Flex Datagrid iteDitor:显示首选标签,但在Commit中检索值



(编辑:请参阅下面提供的答案作为可能的解决方案)

我有一个datagrid,每个datagridcolumn都使用不同的itemrenderers。其中一列中的这些渲染器之一是一个充满值的列表组件。列表组件中显示的文本是其DataProvider的标签。

我想做的就是使列表组件列ItemRenderer成为票务。这意味着用户单击列中的单元格,并显示一个值列表(而不是下拉)。然后,他们可以从列表组件中选择多个值。当他们单击列表组件时,列显示了所选的值。

当他们保存自己的选择时(通过相关数据杂志之外的保存按钮),我想引用该数据以确定他们做出了哪种选择 - 但是 - 而不是标签,我想获得数字与该标签相关联。我用XML做到这一点:

<colors>
<color label="Green" value="1"/>
<color label="Yellow" value="2"/>
<color label="Red" value="3"/>
</colors>

现在,outeDitor零件很棒,因为它在单击单元格之外后可以视觉上查看您的选择效果很好。但是,我想确定所选颜色的值(" 3"),并为此列表中选择的每个值执行此操作。

应使用此列的给定数据Providider,以下DataGridColumn自然识别这一点(清单只是允许多个选择的列表):

<colorData chosenColors=''/>

这是示例代码:

<mx:DataGridColumn dataField="@chosenColors" editorDataField="colors" headerText="Colors" width="200" wordWrap="true">
                    <mx:itemEditor>
                        <fx:Component>
                            <s:MXDataGridItemRenderer focusEnabled="true" height="22" >
                                <fx:Script>
                                    <![CDATA[
                                        public function get colors():String {
                                            var str:String = new String;
                                            for(var i:int=0;i < colorList.selectedItems.length; i++){
                                                if(i > 0){
                                                    str += ",n";
                                                }
                                                str += colorList.selectedItems[i].@label;
                                            }
                                            return str;
                                        }
                                    ]]>
                                </fx:Script>
                                <r:CheckList id="colorList"
                                                    dataProvider="{parentApplication.colors}"
                                                    labelField="@label" width="100%" height="150"/>
                            </s:MXDataGridItemRenderer>
                        </fx:Component>
                    </mx:itemEditor>
                </mx:DataGridColumn>

但是,如果选择了绿色和红色,则可以用以下XML替换XML:

<colorData chosenColors=' Green, Red'/>

相反,我希望由此产生的XML为:

<colorData chosenColors=' 1, 3'/>

请让我知道我如何完成此操作 - 是否在线渲染器,其他实现等。谢谢您的帮助!

尝试此意志帮助您。

而不是从SelecteDItems获得标签文本,例如@Value value属性值。因此,现在成为<colorData chosenColors='1, 3'/>

public function get colors():String {
    var values:Array = [];
    
    for(var i:int=0;i < colorList.selectedItems.length; i++){       
        values.push(colorList.selectedItems[i].@value.toString()); //Note here
    }
    
    return values.toString();
}

1,3也显示在网格中。我不确定您在UI级别的期望。尽管如此,如果您想显示颜色,例如绿色,红色在UI级别,但同时您需要存储它们各自的节点。如果在xml中创建一个又一个属性,例如

<colorData chosenColors='Green, Red' chosenValueColors='1,3' />. 

在这里,用于显示目的的chosencolors和为数据库选择了其他事项。现在,您可以从XML的属性选择的属性中期望值。

基于评论

要获得您需要在itemRenderer中进行override data getter/setter方法,或者您可以使用DataChange事件。

override public function get data():Object
{
    return super.data;
}
override public function set data(value:Object):void
{
    super.data = value;
    
    if(!value)
        return;
    
    var selectedValues:Array = value.@chosenColors.toString().split(","); //get selected value in array
    var selectedIndices:Vector.<int> = new Vector.<int>();
    
    for (var i:int = 0, len:int = colorList.dataProvider.length; i < len; i++) 
    {
        var color:XML = colorList.dataProvider[i] as XML;
        
        if(selectedValues.indexOf(color.@value.toString()) > -1)
            selectedIndices.push(i); //Store index of selected items
    }
    
    trace(selectedIndices.toString());
    
    colorList.selectedIndices = selectedIndices;
}
public function get colors():String {
    
    var values:Array = [];
    
    for(var i:int=0;i < colorList.selectedItems.length; i++){
        
        values.push(colorList.selectedItems[i].@value.toString());
    }
    
    return values.toString();
}
public function colorList_changeHandler(event:IndexChangeEvent):void
{
    data.@value = colors; //IMPORT Commit the selected value to dataProvider.
}

请注意,我们在此处侦听更改事件,以将"提交价值"发生到dataprovider中,例如 change="colorList_changeHandler(event)"

 <r:CheckList id="colorList" change="colorList_changeHandler(event)"
            dataProvider="{parentApplication.colors}"
            labelField="@label" width="100%" height="150"/>

(编辑:此实现存在FLEX 4.11的问题,如果使用AddItem,则有时会更改DataProvider-这可以在Flex 4.12中固定,但我尚未测试。请参见下文评论。分辨率。)

我实际上实施了与Raja Jaganathan略有不同的,但是,我确实相信他的答案也会有所帮助。这是我实施此修复程序的方式。

再次,希望使用XML DataProvider使用XML更新,而不仅仅是在Intereditor完成后文本。我实施的方式是在此URL上遵循Adobe的示例(Flex 4.6指南):使用MX项目编辑器和基于列表的控件的示例

我在列表中使用了一个Inline InteDitor,它类似于我的原始问题。不同之处在于,我取而代之的是为数据功能(类似于Raja所做的)覆盖。在数据功能(在inateDit开始时调用)中,我设置了数据,但也根据XML中列出的颜色设置了列表控件的选定标志。这确保了列表控件显示在用户交互之前已经选择的颜色。

接下来,在inateDit的末尾,我修改了颜色功能,以在XML上设置一个临时属性,其中包含列表中选择的ID。这确保了用户的选择(如果与原件不同)。

现在,这是我挣扎的地方,Raja的答案可能更好。在颜色函数中,我只是在列表控件中将所选XML添加到DataProvider XML中。事实证明,这是非常有问题的,因为如果不先逃脱,Flex不会将XML存储到DataProvider中,而是剩下一团糟的ampersands和HTML编码的XML(即垃圾)。为了解决这个问题,我在DataGrid上为Intiquitend事件创建了一个侦听器。该侦听器称为A函数 - 类似于Adobe示例 - 读取所选颜色ID并替换了Flex用真实XML为我提供的编码XML垃圾。此XML中最重要的事情是立即致电DestrestDefault(),以防止我对DataProvider所做的一切。

做这些事情使我能够为用户提供列表以供您选择,然后一旦搬到数据杂志中的另一个单元格,向用户展示了当前的选择。当用户选择永久将更改保存到表时,它还可以存储这些选择,以便以后的检索。

编辑:在此点下方,是对如何与Adobe的示例不同实施的更深入的解释。

在修改editedItemeditor.data时,上面的Adobe链接存在一些问题。相反,我在数据网格中添加了一个Intiqutend事件处理程序功能,例如:

<mx:DataGrid id="dataGridSvcTypeReasons" height="100%" width="100%" dataProvider="{dataProvider}" editable="true" itemEditEnd="dataGrid_itemEditEndHandler(event)">

在处理程序函数中,我操纵了原始数据 - 不是editeditemrenderer.data每个Adobe的示例:

protected function dataGrid_itemEditEndHandler(event:DataGridEvent):void{
    if (event.reason == DataGridEventReason.CANCELLED){
        // Do not update cell.
        return;
    }
    event.preventDefault();
    var data:Object = dataProvider.getItemAt(event.rowIndex);
    // look to see if my list exists (if not, then this edit does not pertain to my list)
    if(event.currentTarget.itemEditorInstance.hasOwnProperty("myList")){
        var selectedItems:Vector.<Object>;
        selectedItems = event.currentTarget.itemEditorInstance.myList.selectedItems;
        delete data.colors;
        data.appendChild(<colors/>);
        if(selectedItems){
            for each(var item:XML in selectedItems){
                for(var i:int = 0; i < myList.dataProvider.length; i++){
                    if(myList.dataProvider[i].@value == item.@value){
                        data.colors.appendChild(new XML(myList.dataProvider[i]));
                        break;
                    }
                }
            }
        }
    }
}

此方法将避免由于破坏Adobe示例中发现的编辑的Inteditemrenderer而引起的GUI问题。

相关内容

  • 没有找到相关文章

最新更新