2012-12-27 31 views
0

我有几个dropdownlist控件,共享相同的dataprovider(相同的参考)。Flex下拉列表数据提供重置在刷新

我已经重写了sort函数的set dataprovider方法(代码如下)。问题在于,当我将此共享数据提供者设置为新的下拉列表时,共享数据存取者的所有现有下拉控件都将被取消选中(丢失之前选定的值)。

override public function set dataProvider(value:IList):void{ 
      if(value is ArrayCollection){ 
      var sort:Sort=new Sort(); 
      var sortField:SortField = new SortField(); 
      sortField.numeric=false; 
      sort.fields=[sortField]; 

      ArrayCollection(value).sort=sort; 
      ArrayCollection(value).refresh(); 
     } 
     super.dataProvider=value; 
    } 
+1

对每个组件中的dataProvider进行排序似乎会引入如此和/或将来的随机问题。是否有可能在组件外排序一次?一般来说,组件在渲染时不应该修改数据(某些Flex图表组件会这样做,并警告您它们会“破坏”数据)。以下来自@Markus Rossler的建议已被发现,除非要小心索引因排序而改变。 –

回答

1

在组件之间有大量的isue共享dataProvider。我们已经用很多使用AutoCompleteComboBox的客户端来解决这个问题。

您可以轻松地为每个dataProviders使用相同的源,但是使用不同的 - separate - collection。

var dataProvider1 :ArrayCollection = new ArrayCollection(someArray); 
var dataProvider2 :ArrayCollection = new ArrayCollection(someArray); 
var dataProvider3 :ArrayCollection = new ArrayCollection(someArray); 

每个集合都只是一个基本来源的包装。对其中一个进行排序不会影响其他任何其他组件,因此不会影响其他ComboBoxes或DropDownLists。

+0

我创建了列表的新实例并解决了问题。 感谢所有。 :) – Saju

0

我也没有这方面的研究,但有两个问题/想法来了:

  1. 如果你从字面上使用相同的参照相同的ArrayCollection,则不需要进行排序这个数组不止一次
  2. (你实际上是通过分配相同的ArrayCollection不止一次这样做),如果只左右单项选择下拉列表,然后有一个简单的解决方案:

    var oldSelected : TypeOfItem = selectedItem as TypeOfItem; 
    // do the sort (like in your code) 
    super.dataProvider=value; 
    selectedIndex = getItemIndex(oldSelected); 
    
+0

另一个想法(未经测试!)是:在第一行中分配数据提供者,而不是在最后一行。 –

+0

我试过第二种方法,但没有工作。关于第一个,我无法确定数据提供者是否被排序。我总是希望下拉列表显示排序列表,在任何他们使用,相同。关于排序的 – Saju

+0

:我的意思是,如果您为一个以上的dropdownlist使用一个arraycollection,那么您实际上为每个“myDropDown.dataProvider = theOneArrayCollection;”调用排序。分配。那么如何对arraycollection进行一次排序并将已经排序的arraycollection版本分配给下拉菜单? –

相关问题