0

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

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

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>

我现在真的很绝望。任何帮助将不胜感激。

4

2 回答 2

2

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

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

于 2012-04-06T12:20:51.643 回答
0

我不太擅长 Flex/Flash-Builder,但我擅长使用 actionscript。您的代码对我来说看起来有点截断/简化?你能发布完整的功能吗?

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

于 2012-04-06T05:00:52.750 回答