datagrid FLEX中的不同行样式

时间:2011-05-16 09:33:48

标签: flex datagrid row

如果在数据字段中找到某个单词,我正在尝试更改数据网格中行的字体颜色。 是否有简单的内联方式来执行此操作?

由于

3 个答案:

答案 0 :(得分:3)

您可以覆盖DataGrid的drawRowBackground方法,并检查它是否需要自定义背景。
如果是这样,请将新背景颜色传递给此方法的super调用:

protected override function drawRowBackground(s:Sprite, rowIndex:int, 
    y:Number, height:Number, color:uint, dataIndex:int):void
{
    if ((dataProvider[dataIndex] as String).indexOf(someWord) >= 0)
        color = yourCustomColor;
    super.drawRowBackground(s, rowIndex, y, height, color, dataIndex);
}

其中someWord是您要搜索的字词,而yourCustomColor是代表新背景颜色的uint,例如:

var yourCustomColor: uint = 0xff0000;

答案 1 :(得分:1)

您可以尝试使用以下代码。请注意以下几点:

1)如果要在datagrid中显示简单文本,请使用此方法(嗯,您也可以为其他类型的渲染执行此操作,但是您也必须在其他渲染器中编写类似的代码)。

2)在这种方法中,当我们说“突出显示”时,基本上我们正在重新创建项目渲染器。所以这会导致一些性能下降,我觉得。如果你使用简单的项目渲染器,我不认为这会产生很大的影响关于性能。

主要应用程序mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="955" minHeight="600"
                creationComplete="application1_creationCompleteHandler(event)">

    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private var rendererFactory:ClassFactory;

            protected function btn_clickHandler(event:MouseEvent):void
            {
                setFilterWordInRenderer();
            }


            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                setFilterWordInRenderer();
            }

            private function setFilterWordInRenderer():void
            {
                if(!rendererFactory)
                    rendererFactory =  new ClassFactory(CustomItemRenderer)

                //Data for the renderer.The word to check.
                rendererFactory.properties = {filterWord:textInput.text};
                //Only set the renderers to the columns where you want this highlighting to be done.                
                col1.itemRenderer = rendererFactory;
                col2.itemRenderer = rendererFactory;
            }

        ]]>
    </mx:Script>

    <mx:TextInput id="textInput"/>
    <mx:Button id="btn" label="Highlight" click="btn_clickHandler(event)"/>
    <mx:DataGrid id="dtg">
        <mx:dataProvider>
            <mx:XMLList id="datXML" xmlns="">
                <value id='test1'>abc</value>
                <value id='test2'>sadad</value>
                <value id='23'>ytuyt</value>
                <value id='24'>uytuty</value>
                <value id='62'>erewewwer</value>
                <value id='72'>tefcvsrwert</value>
                <value id='28'>uiiyui</value>
                <value id='82'>tryry</value>
                <value id='28'>iouoo</value>
                <value id='test1'>abc</value>
                <value id='test2'>sadad</value>
                <value id='23'>ytuyt</value>
                <value id='24'>uytuty</value>
                <value id='62'>erewewwer</value>
                <value id='72'>tefcvsrwert</value>
                <value id='28'>uiiyui</value>
                <value id='82'>tryry</value>
                <value id='28'>iouoo</value>
            </mx:XMLList>
        </mx:dataProvider>
        <mx:columns>
            <mx:DataGridColumn id="col1" headerText="Col1" dataField="@id"/>
            <mx:DataGridColumn id="col2" headerText="Col2" dataField="*"/>
        </mx:columns>
    </mx:DataGrid>
</mx:Application>

CustomItemRenderer.mxml 的内容(假设与上述mxml位于同一文件夹中)

<?xml version="1.0" encoding="utf-8"?>
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml"
          color="{text.indexOf(_filterWord,0) != -1?0xFF0000:0x000000}">
    <mx:Script>
        <![CDATA[
            import mx.controls.DataGrid;
            import mx.controls.dataGridClasses.DataGridListData;

            //The word to check,for font color changing.
            [Bindable]
            private var _filterWord:String;

            public function set filterWord(value:String):void
            {
                if(value!='')
                    _filterWord = value;
                else
                    _filterWord = null;
            }

            override public function set data(value:Object):void 
            {
                if(!value)
                    return;
                super.data = value;
                //Set the label text,using listdata and datafield to make the item renderer as generic as possible.
                text = data[DataGridListData(listData).dataField];
            }

        ]]>
    </mx:Script>
</mx:Label>

希望有所帮助。与此同时,我也会看看你能否以更简单的方式实现这一目标。

答案 2 :(得分:0)

虽然rekaszeru的方法肯定是有效的,但我认为将这个逻辑放在项目渲染器中更合乎逻辑。
您可以根据数据创建custom item renderer并在其中设置setStyle("color", "...")。只是不要忘记在找不到单词时清除颜色,因为渲染器会被重复使用,如果不被覆盖则会包含旧值。