CellRenderer.setValue()

可用性

Flash Player 6 (6.0.79.0)。

版本

Flash MX 2004。

用法

componentInstance.setValue(suggested, item, selected)

参数

suggested 用于表示单元格渲染器的文本的值(如果需要)。

item 表示要呈现的整个项的对象。单元格渲染器可以使用此对象的属性进行渲染。

selected 一个字符串,具有以下可能值:"normal""highlighted""selected"

返回

无。

描述

方法;采用指定的值,并在单元格内将其显示出来。这将使单元格中已显示内容以及要为新项目在单元格中显示的内容不会有任何不同。(请记住,任何单元格处于列表中时都可能显示多个值。)这是最重要的 CellRenderer 方法,您必须在每个单元格渲染器中实现该方法。

setValue() 方法经常被调用(如发生滑过、选择、调整列的大小或滚动时)。必须记住的一点是单元格可能不在舞台上,因此在调用 setValue() 时不应始终用数据更新单元格。例如,特定的单元格可能会随时滚动出显示区域,或者可能被重用以呈现其它值。出于此原因,不能直接引用网格中的特定单元格渲染器实例,而应在 setValue() 体内编写 if 语句,使得只有在定义了 item 参数并发生了更改的情况下才允许运行代码。如果未定义 item 参数,则表示单元格在视觉上为空,并且应为单元格中的所有项分配一个值为 false_visible 属性。单元格可能需要暂时在视觉上为空,如在 DataGrid 中发生滚动时。

如果一行被选中且鼠标指针位于该行上,则 selected 参数的值为 "highlighted",而不是 "selected"。如果试图根据行的选中状态而调整单元格渲染器的行为,这可能会产生问题。若要测试当前行是否处于选中状态,请使用下面的代码:

var reallySelected:Boolean = selected != "normal" && listOwner.selectedNode == item;

示例

以下示例说明如何使用 setValue()editField() 来引用网格中的单元格渲染器实例。

由于单元格可能会随时不在舞台上(可能会滚动出显示区域,或者可能被重用以呈现其它值),因此您不能直接引用网格中的特定单元格渲染器实例。

可以改用数据提供者与网格内的特定单元格通信。数据提供者保存关于网格的所有状态信息。为了将给定单元格显示为已启用或已选择,数据提供者中应该存在相应字段以保存该信息。单元格渲染器的 setValue() 方法将数据提供者状态的更改传达给该单元格。下面是一个在单元格中呈现复选框的理论上的单元格渲染器的 setValue() 实现:

function setValue(str, itm, sel)
{
/* 假设数据提供程序具有两个与此单元格相关的字段:checked 和 enabled。
这种数据提供者的形式可能如下所示:
[
{field1:"DisplayMe", field2:"SomeString", checked:true, enabled:false}
{field1:"DisplayMe", field2:"SomeString", checked:false, enabled:true}
{field1:"DisplayMe", field2:"SomeString", checked:true, enabled:true}
]
*/

/* 如果未定义 item 参数,则隐藏通常在单元格中呈现的所有内容。否则,将用新数据更新单元格内容。
*/
    if (itm == undefined){
        myCheck._visible = false;
    }else{

        // 冗余检查
        if (myCheck.selected!=itm.checked){
            myCheck.selected = itm.checked;
        }
        if (myCheck.enabled!=itm.enabled){
            myCheck.enabled = itm.enabled;
        }
    }
}

如果您要在第二行上启用复选框,则可以通过数据提供者进行通信。对数据提供者所做的任何更改(当通过如 DataProvider.editField() 的 DataProvider 方法进行更改时)都调用 setValue() 以刷新网格的显示。此代码在 Flash 应用程序中编写,无论是在帧上、对象上,还是在其它类文件中(但不能在单元格渲染器类文件中):

// 再次调用 setValue()
myGrid.editField(1, "enabled", true); 

以下示例会将图像加载到单元格内的加载器组件中,具体取决于传递的值:

function setValue(suggested, item, selected) : Void
{
/* 如果未定义 item 参数,则隐藏通常在单元格中呈现的所有内容。否则,将用新数据更新单元格内容。
*/
    if (item == undefined){
        loader._visible = false;
    }else{
        // 清除加载器
        loader.contentPath = undefined;
        // 列表数据提供者中的不同图像有不同的 URL
        if (suggested!=undefined){
            loader.contentPath = suggested;
        }
    }
}

以下示例摘自一个多行文本单元格渲染器:

function setValue(suggested:String, item:Object, selected:Boolean):Void
{
/* 如果未定义 item 参数,则隐藏通常在单元格中呈现的所有内容。否则,将用新数据更新单元格内容。
*/
    if (item == undefined){
        multiLineLabel._visible = false;
    }else{
        // 向标签添加文本
        multiLineLabel.text = suggested;
    }
}

以下示例摘自一个单选按钮渲染器。如果未定义 item 参数,则单元格可能滚出显示区域并应在视觉上为空。可以使用 if 语句确定是否未定义 item 参数。如果未定义 item 参数,则可以通过将单选按钮的 _visible 属性设置为 false 来隐藏它;否则用新数据更新该单选按钮并显示它。

function setValue(str:String, item:Object, sel:String) : Void {
/* 如果未定义 item 参数,则隐藏通常在单元格中呈现的所有内容。否则,将用新数据更新单元格内容。
*/
    if (item == undefined) {
        radio._visible = false; }
    else {
        trace(item.data + " " + item.label + " " + item.state + " " + sel);
        radio.label = item.label;
        radio.data = item.data;
        radio.selected = item.state;
        radio._visible = true; 
    }
}