Flash构建器:Datagrid上的奇怪行为

时间:2012-04-06 00:58:49

标签: flash flex datagrid

这个问题让我发疯了,我真的需要你帮忙。

我有一个数据网格,显示从mysql查询的数据。如果用户向数据库添加新记录,我试图向我的数据网格添加一个新行。换句话说,我希望datagrid能够反映数据库中上传的数据。 datagrid似乎只适用于我添加的第一条记录。如果我尝试添加第二条记录,则会添加新行,但它也会将第一行更改为新更新的记录。我知道它有点难以理解所以我在这里画了一张照片。

DATAGRID

id   name     number
1    test1     111
2    test2     222

假设我添加了一条新记录,数据网格将是

id   name     number
1    test1     111
2    test2     222
3    test3     333  //new record, works fine.

但如果我添加另一条记录,它将变为

id   name     number
1    test1     111
2    test2     222
4    test4     444  //old record, the values change to the newest record.
4    test4     444  //new record, but also change the previous record

如果我再次添加另一条记录,它将变为

id   name     number
1    test1     111
2    test2     222
5    test5     555  //first record, the values change to the newest record.
5    test5     555  //second record, the values change to the newest record.
5    test5     555  //newest record, change the previous 2 records

我已经做了任何我能想到的调试,但仍然没有运气。 以下是我的代码:

// my php data service
<s:CallResponder id="addResult" result="addResult_resultHandler(event)" />

<script>

        //The handler after the user click ADD button

        protected function addBtn_clickHandler(event:MouseEvent):void
            {
                var newData:object = new Object();  
                newData.test1=formField1.text;
                newData.test2=formField2.text;
                newData.test3=formField3.text;
                newData.test4=formField4.text;


                            addResult.token=Service.createJob(newData);



            }





  //the result handler for data service. 
        protected function addResult_resultHandler(event:ResultEvent):void
                {
                           //jobData is my dataProvider in my datagrid component 
                          //not sure why addItem() would mess me up so badly...
                           //newData is an Object created after user click the update    
                           //button

                           jobDG.jobData.addItem(newData);          
                }


    Mxml

    <components:dataGridPanel  id="jobDG"
                               jobData="{getJobsResult.lastResult}"/>


    My datagrid component

    mxml
        <s:DataGrid id="dg" editable="true" x="5" y="3" width="734" height="253">
            <s:columns>
              <s:ArrayList>

                <s:GridColumn dataField="test1" headerText="text1">      
                            </s:GridColumn>
                <s:GridColumn dataField="test2" headerText="text2">            
                            </s:GridColumn>
                <s:GridColumn dataField="test3" headerText="text3">  
                            </s:GridColumn>
                <s:GridColumn dataField="test4" headerText="text4">  
                            </s:GridColumn>
               </s:ArrayList>
            </s:columns>
            <s:typicalItem>
            <fx:Object text1="aaaaa" text2="bbbbb" text3="ccccc" text4="dddddd">  
                     </fx:Object>
            </s:typicalItem>
             <s:AsyncListView list="{jobData}" />
        </s:DataGrid>

我现在非常绝望。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我同意其他评论者的观点,即您发布的代码不太可能是您实际使用的代码,但我认为它确实显示了您的问题的种子。我认为您有一个名为newData的实例变量,您可以在类的顶部实例化,而不是在addBtn_clickHandler函数中实例化。

第一次使用它,因为你之前从未将它添加到集合中。再次单击该按钮时,我怀疑您只是更改同一对象上的属性,然后将其添加到结果处理程序中的集合中(而不是查看事件的数据以获取从该对象返回的新对象)数据库)。

答案 1 :(得分:0)

我对Flex / Flash-Builder并不是非常好,但我对动作脚本很好。您的代码看起来有点截断/简化给我?你能发布完整的功能吗?

我对DataProviders也不是很了解,但我理解这个概念并且之前使用过DataGrids。我仔细检查AS3 docs on DataGrids:看起来每个示例都首先完整定义了提供程序,然后将其应用于网格。您可能必须使用一些特殊的侦听器设置事件,甚至在更新数据后销毁并重建整个网格?我认为它只是前端显示问题,但如果没有更多代码,我们就无法排除后端逻辑问题。