Flex:通过CFC保存可编辑的数据网格

时间:2009-03-12 19:13:42

标签: flex datagrid coldfusion cfc

我有一个可编辑的数据网格,我需要能够通过ColdFusion中的CFC与其他表单字段一起保存。

基本上,目标是通过RO检索到多个位置,这些位置组成第一列,其余列是数据类型,即人口统计,客户注释,约会等,其想法是用户勾选每个网格中的复选框表示他们很乐意与这些位置共享数据类型。它必须以这种方式完成,因为位置可能会发生变化,因此随着时间的推移可能会有两个或四个或更多。

代码运行到目前为止运行并且看起来很好但是节省的位数让我疯了!请帮忙。

提前致谢 :) 代码(由于理智原因而缩减)如下:

public function handleconsentResult(event:ResultEvent):void {
            consentDatagrid.dataProvider = event.result;
            }
<mx:RemoteObject id="consentQuery"
    destination="ColdFusion"
    source="Build3.consent"
    showBusyCursor="true">
    <mx:method name="getconsent" result="handleconsentResult(event)" fault="fault(event)" />

<mx:DataGrid id="consentDatagrid" creationComplete="init()" width="98%" wordWrap="true" textAlign="center">
                        <mx:columns>
                            <mx:DataGridColumn headerText="Organisation" width="100" textAlign="left" id="Location" dataField="LocationName" wordWrap="true"/>
                            <mx:DataGridColumn headerText="Demographics"  width="100" wordWrap="true" textAlign="center" itemRenderer="mx.controls.CheckBox" rendererIsEditor="true" editorDataField="ClientDemographics" />
                            <mx:DataGridColumn headerText="Appointments"  width="100" wordWrap="true" textAlign="center" itemRenderer="mx.controls.CheckBox" rendererIsEditor="true" editorDataField="ClientAppointments"/>
                            <mx:DataGridColumn headerText="Activity"  width="70" wordWrap="true" textAlign="center" itemRenderer="mx.controls.CheckBox" rendererIsEditor="true" editorDataField="ClientActivity"/>
                            <mx:DataGridColumn headerText="Notes" width="50" wordWrap="true" textAlign="center" itemRenderer="mx.controls.CheckBox" rendererIsEditor="true" editorDataField="ClientNotes"/>
                        </mx:columns>
                    </mx:DataGrid>

3 个答案:

答案 0 :(得分:1)

听起来你想要做的就是将DataGrid的全部内容作为其余表单数据的一部分返回。我还在学习Flex,但我相信它会自动从ArrayCollection转换为Query,因为你正在使用AMF。

由于您没有为DataGrid使用dataProvider属性,我假设您将一个ArrayCollection对象绑定到您从init事件调用的creationComplete函数中的DataGrid。在这种情况下,您需要在将表单数据返回到服务器之前执行相反的操作:将DataGrid值复制回您要返回的变量。

或者,您可以使用可绑定的ArrayCollection变量,以便在用户更新DataGrid时,ArrayCollection变量已经更新,您只需将其返回ColdFusion即可。

答案 1 :(得分:0)

我不知道CF中的Flex,但您是否确定是要立即保存它们还是某种“保存”或“提交”操作?

如果您要同时保存所有内容,那么Iterating over a ColdFusion Query in Flex上的这篇文章可能会有所帮助。

否则我只会在每个单元格中的onChange事件上放一个Listener并实时写入。

答案 2 :(得分:0)

我需要做类似的事情,我发现在actionscript中创建一个“数据集”对象以及一个相互映射的类似CFC很有效。从flex开始,调用远程方法传递actionscript对象,然后在CF端将它转换为cfc。

[RemoteClass(alias = "model.DataSet")] **//maps to the CFC**    
[Bindable]
public class DataSetVO
{       

    public var rows:Array;

    public function DataSetVO() 
    {

    }

}

CFC就像这样。确保设置alias属性以匹配actionscript对象的RemoteClass中设置的别名:

<cfcomponent name="DataSet"  alias="model.DataSet"> 
<cfproperty name="rows" type="array" />
</cfcomponent>

保存数据的CFC方法可以像

    <cffunction name="saveToFile" access="remote" returntype="numeric" hint="">
    <cfargument name="dataSet" type="model.GPDataSet" required="true" />
    <!--- do what you need to do to with arguments.dataSet to 
                  save to a file, database, whatever --->
    <cfreturn 0 />
</cffunction>

来自flex的调用如下:

 //make a remote call to save the grid 
 //populate your VO with the contents of the grid, in this case I have an object
 //that gives me one, basically iterate over the dataprovider of the grid
var myVO:DataSetVO = myDataSet.getAsVO();
//calling the remote CFC passing the VO that will be mapped to a CFC on the server
cfsvc.saveToFile(myVO);  

将复杂对象从Flex映射到CF可能有点棘手,但一旦设置它就非常好。

这些文章可能会有所帮助

http://www.jeffryhouser.com/index.cfm/2007/10/9/Why-does-ColdFusion-return-a-CFC-to-Flex-as-a-generic-object

http://mxbase.blogspot.com/2008/07/passing-custom-objects-between-flex-and.html