【问题标题】:AS3 datagrid - Hide a rowAS3 数据网格 - 隐藏一行
【发布时间】:2014-05-31 06:11:57
【问题描述】:

我正在使用 2 个组合框来过滤已通过 csv 文件填充的 dataGrid。第一个组合框过滤列并且工作正常:

//Listener and function for when the Agreement ID is selected
agreement_cb.addEventListener(Event.CHANGE, agreement);
function agreement(event:Event):void 
{
    //get the number of columns 
    var columnCount:Number = myGrid.getColumnCount();

    for (var i:int=0; i<columnCount; i++)
    {
        myGrid.getColumnAt(i).visible = false;
    }
    var columnNumber:Number = agreement_cb.selectedItem.data;
    myGrid.getColumnAt(columnNumber).visible = true;
    myGrid.getColumnAt(0).visible = true;
    myGrid.columns[0].width = 200;
}

但是我找不到任何关于如何获得相同类型的函数来隐藏所有行的信息,除了他们从第二个下拉列表 (codes_cb) 中选择的行。

感谢任何帮助...

更新:

loadedData = myLoader.data.split(/\r\n|\n|\r/);
    loadedData.pop();
    for (var i:int=0; i<loadedData.length; i++)
    {
        var rowArray:Array = loadedData[i].split(",");
        loadedData[i] = {"SelectAgreement":rowArray[0],"KSLTPROF0057":rowArray[1] .........};
    }
    loadedData.shift();
    myGrid.columns = ["SelectAgreement", "KSLTPROF0057", ......];

    import fl.data.DataProvider;
    import fl.controls.dataGridClasses.DataGridColumn;

    myGrid.dataProvider = new DataProvider(loadedData);

【问题讨论】:

  • 你的dataProvider使用什么类?

标签: actionscript-3 flash datagrid filter flash-cs5


【解决方案1】:

DataGrid 始终显示其dataProvider 中的所有对象,因此要隐藏行,您需要隐藏数据对象。一些作为dataProviders 工作的类内置了这个功能,这使得这非常容易(任何实现IList 的类都可以作为dataProvider 操作),但是fl.data.DataProvider 不是这些类之一。

因此,我将同时使用两者来提供答案,如果可以的话,我强烈建议使用 mx.collections.ArrayCollection 而不是 fl.data.DataProvider


第 1 部分:fl.data.DataProvider

为此,我假设您的 loadedData 数组是一个类属性,而不是在函数中声明。

function agreement(event:Event):void 
{
//your existing code here
    var dataProvider:DataProvider = MyGrid.dataProvider as DataProvider;//recover the dataprovider
    dataProvider.removeAll();//remove all rows
    for (var x:int = 0; x<loadedData.length; x++)
    {
        if (loadedData[x] == "SELECTION MATCH") //insert here your selection criteria
        {
           dataProvider.addItem(loadedData[x]); //add it back into the dataProvider
        }
    }
}
function resetFilter():void
{
    var dataProvider:DataProvider = MyGrid.dataProvider as DataProvider;//recover the dataprovider
    dataProvider.removeAll(); //prevent duplication
    dataProvider.addItems(loadedData);//reload all rows
}

第 2 部分:mx.collections.ArrayCollection

我推荐这个的理由是因为ArrayCollection 已经具备执行此操作的功能,而不会因对象失去范围而丢失数据,它还减少了您需要执行的代码/操作的数量。为此,我们使用ArrayCollection.filterFunction & ArrayCollection.refresh() 过滤“可见数组”而不更改源。

private var dataProvider:ArrayCollection = new ArrayCollection(loadedData);
MyGrid.dataProvider = dataProvider;
function agreement(event:Event):void
{
    //your existing code here
    dataProvider.filterFunction = myFilterFunction;//use my filter
    dataProvider.refresh();//refresh the visible list using new filter/sort
}
function resetFilter():void
{
    dataProvider.filterFunction = null;//clear filter
    dataProvider.refresh();//refresh the visible list using new filter/sort
}
function myFilterFunction(item:Object):Boolean
{
    if (item == "SELECTION MATCH") return true;//insert your selection criteria here        
    else return false;
}

filterFunction 接受function 并使用它来测试ArrayCollection 中的每个对象,该函数必须返回一个布尔值,true 表示“是,显示此对象”,false 表示“不要显示”。

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2013-04-19
    • 2016-01-23
    • 2023-03-30
    • 2013-10-19
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    相关资源
    最近更新 更多