(编辑:请参阅下面提供的答案作为可能的解决方案)
我有一个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问题。