【问题标题】:In Flex how to refresh dataprovider on datagridFlex中如何刷新datagrid上的dataprovider
【发布时间】:2014-01-31 11:50:37
【问题描述】:

请帮帮我...

我有一个简单的 DataGrid,dataprovider 是一个服务“getServiceDatiResult.lastResult”,这个服务来自 webmethod aspnet,它返回一个 sqlserver 数据。 我通过 click_button 创建了事件,它将数据插入数据并将数据获取到 Datagrid .... 问题是数据网格。只有当我多次调用按钮事件时才会刷新数据..

我试过了:

datagrid.refresh();

datagrid1.columns.clear();
datagrid1.columns.refresh();

getServiceDatiResult.lastResult.refresh();
getServiceDatiResult.lastResult.commit();

代码:

<mx:DataGrid id="datagrid1" creationComplete="datagrid1_creationCompleteHandler(event)"
             dataProvider="{getServiceDatiResult.lastResult}" dropShadowVisible="true"
             fontSize="12" fontWeight="normal" textAlign="center" verticalAlign="middle" editable="true">

<s:Button id="button3"  label="Insdata3_now" click="button3_clickHandler(event)"/>


[Bindable]
protected function button3_clickHandler(event:MouseEvent):void
{
    getServiceDatiResult.token = service.getServiceDati();

        <!-- regresh ???? -->           
    getServiceDatiResult.lastResult.commit();
    getServiceDatiResult.lastResult.refresh();
}

【问题讨论】:

  • 这似乎有很多问题,所以发布您的服务调用代码以及您的 webmethod(xml,array,json) 的返回类型。
  • @RajaJaganathan 我不认为他的服务调用代码在这里很重要;特别是因为他没有以任何方式处理结果。数据提供者是 getServiceDatiResult.lastResult 。但是,了解返回的数据类型会有所帮助;可能不是 JSON b/c,Flex MX DataGrid 不知道如何处理它。
  • @Reboog711 我在服务调用的地方我们需要使用 getServiceDatiResult.lastResult 分配给 Arraycollection 以便它自动更新。所以无论如何我们都可以快速解决问题。np
  • 如何将 getServiceDatiResult.lastResult 分配给 Arraycollection??

标签: apache-flex


【解决方案1】:

你想刷新 DataGrid 的数据提供者;这反过来将更新 DataGrid。

假设你有一个 ArrayCollection,你可以使用 refresh() 方法刷新所有项目:

(datagrid.dataProvider as ArrayCollection).refresh();

如果您只刷新单个项目,您可以通过使用 itemUpdated() 更新单个项目来节省一些处理时间:

(datagrid.dataProvider as ArrayCollection).itemUpdated(item);

MX DataGrid 将获取任何对象并尝试在 DataGrid 中显示它,因此如果您从服务器返回一个 Array 或 XML,您可能需要替换 dataProvider:

datagrid.dataProvider = newDataProvider;

【讨论】:

  • 你的 dataProvider 是 ArrayCollection 吗?
  • 顺便说一句,我只想指出,使用强制转换总是比使用“AS”运算符更好。因为现在您将可能的错误隐藏在另一个后面 - 想象一下 dataProvider 不是 ArrayCollection。如果你转换为 arraycolelction,你会得到很好的错误:“不能将 XXX 转换为 ArrayCollection。但是在你写它的情况下,你会得到“访问 null arror”,这并没有说明你什么,经过一些挖掘之后你会发现您的类型不正确,然后您的预期......
  • @user3190916 'as' 操作符是一种转换方式。
  • 也可以看看这个关于演员表现的另一个问题的答案:stackoverflow.com/a/14268394/133840
【解决方案2】:

我同意 Reboogs 的解决方案。另一种方法是做,dataGrid.invalidatelist(),dataprovider.refresh() 相比,这有点重,因为失效将重新加载并重新绘制 UI。

【讨论】:

    【解决方案3】:

    我认为如果您正确编写此请求调用,则根本不需要刷新!对我来说,看起来你正在调用一些异步请求,但也许你假设它是同步操作的。我认为是因为处理程序方法中的 [Bindable] 标记,你为什么有它?

    但要决定我认为您没有向我们提供所有信息。例如 - 设置变量 getServiceDatiResult 在哪里?你在里面设置了一些令牌,但是最后一个结果是在哪里设置的?

    我再说一遍,我认为只是调用简单的请求,不需要刷新任何东西,问题出在其他地方 - 处理请求本身。

    【讨论】:

      【解决方案4】:

      (datagrid.dataProvider as ArrayCollection).refresh();当您使用像 dataprovider 这样的数组时,方法是有效的......在我的情况下,问题是单击按钮(事件)调用 3 个服务来获取更新 3 个不同的数据网格......所以我有 3 个调用响应程序在 3 上通过 aspNet 选择到 SqlServer。 .. sincronize所有操作太多了...我的临时个人解决方案是修改Sql Table并通过单击按钮(事件)减少操作..这样datagrid更新完美...但我正在研究一个新的解决方案..谢谢求救……

      【讨论】:

        【解决方案5】:

        只需如下刷新您的数据提供者,

        var datapro:ArrayCollection = new ArrayCollection();
        //
        
        function dataRefresh():void
        {
          datapro.refresh();
        }
        
        //
        //
        <mx:DataGrid id="datagrid1"  creationComplete="datagrid1_creationCompleteHandler(event)" dataProvider="{datapro}">
        //
        //
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-08
          相关资源
          最近更新 更多