【问题标题】:Flex itemRenderer to bold dynamically based on the cell contentsFlex itemRenderer 根据单元格内容动态加粗
【发布时间】:2013-10-14 14:18:47
【问题描述】:

Flex 4 帮助我需要一个 itemRenderer 来设置数据网格整行的 fontWeight 的样式,以便根据该行中任何单元格的单元格内容动态加粗。因此,例如,如果我的整个数据网格中的单元格内容等于字符串“ALL”,我希望数据网格中包含该单元格的整行为“粗体”。注意:这不是 XML 数据。

Render

protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
            super.updateDisplayList(unscaledWidth,unscaledHeight);
            if (data.toString() == "ALL"){
                setStyle("fontWeight","bold");
            }else{
                setStyle("fontWeight","normal");
            }

        }

MXML Code
<mx:VBox width="100%" id="statsGridBox"   height="40%" >
<mx:DataGrid id="statsGrid" width="100%" height="100%" itemRenderer="com.jpmc.ctrbs.dashboard.alarms.renderers.FontWeightRowRender"/>
</mx:VBox>

【问题讨论】:

    标签: flash apache-flex actionscript datagrid flex4


    【解决方案1】:

    StephenNYC 的回答有效,但最后我认为在我所处的情况下使用 mx:AdvancedDataGrid 并应用 styleFunction="myStyleFunc" 来更改 fontWeight 会更容易。

    MXML

    <mx:AdvancedDataGrid id="statsGrid" width="100%" height="100%" styleFunction="myStyleFunc" />
    

    脚本

    <fx:Script>
    <![CDATA[
    private function myStyleFunc(data:Object,col:AdvancedDataGridColumn):Object {
                    if(data) {
                        for( var propertyName : * in data){
                            if (data[propertyName] == "ALL") { 
                                return {fontWeight:"bold"}; 
                            }
                        }
                    }
                    return {fontWeight:"normal"};      
                }
            ]]>
        </fx:Script>
    

    【讨论】:

    • 通过接受您自己的答案,尽管它是对原始问题的不同问题的答案,尽管其他人提供了正确的答案,尽管承认给您的解决方案确实有效,但这并不鼓励我/其他人提供任何帮助。很有可能,您将来会经常回答您的问题。
    【解决方案2】:

    首先,如果您希望仅在单元格级别突出显示,请将您的代码放在 itemrender "FontWeightRowRender" 中。

    在您的渲染器中,您可以执行以下操作:

                override public function set data(value:Object):void {              
                super.data = value;
    
                if (String(value) == "ALL") {
                    boldText.visible = true;
                    normalText.visible = false;                 
                } else {
                    boldText.visible = false;
                    normalText.visible = true;
                }
            }
    

    <s:Group>       
        <s:Label id="boldText" text="{label}" width="100%" fontWeight="bold"/>
        <s:Label id="normalText" text="{label}" width="100%" fontWeight="normal"/>
    </s:Group>  
    

    更新:突出显示一行的示例

                override public function set data(value:Object):void {              
                super.data = value;
                                if (!value) return;             
    
                if (MyValueObject(value).isBoldRow()) {
                    boldText.visible = true;
                    normalText.visible = false;                 
                } else {
                    boldText.visible = false;
                    normalText.visible = true;
                }
            }
    

    MyValueObject.as

         public function isBoldRow():Boolean {
              if ((this.attrib1 == "ALL") || (this.attrib7 === "ALL"))
               return true;
               return false; 
          }
    

    【讨论】:

    • 我需要根据该行中任何特定单元格的数据内容在行级别进行突出显示。因此,最终我有一个具有 7 列的 dataGrid,并且根据每个日期范围内某些警报发生的次数动态填充行。在数据网格的日期范围内的每一天结束时,警报信息中都有字符串“ALL”,其余行是当天的总计。我需要在该警报字段(实际上是用于我的数据库的 MODEL_NAME)中包含此“ALL”字符串的任何行加粗。
    • 所以你的意思是如果该行中的任何单元格包含“ALL”,整行应该显示为粗体?如果是这种情况,您可以使用相同的 itemrenderer 代码,并在您的值对象中添加一个便利函数,如“isBoldRow()”(布尔值),并在“set data()”中的 IF 条件中使用该函数。 isBoldRow 基本上包含决定是否应突出显示该行的代码。
    • 是的,没错。我会试试的,谢谢!
    【解决方案3】:

    你应该把你的 setStyle 代码放在你的单元格渲染器的 [overriden] set data 方法中。然后在数据更改时设置样式,而不是在重新绘制渲染器时设置(在数据更改时可能不会发生,正如您所经历的那样)。

    在渲染器中:

    override public function set data(value:Object):void
    {
        super.data = value;
        if (data && data.toString()=="ALL")
            setStyle("fontWeight","bold");
        else
            setStyle("fontWeight","normal");
    }
    

    【讨论】:

    • 对不起,我应该说受保护的覆盖功能有效。问题是它改变了我的dataGrid粗体的整个fontWeight。我只需要它来更改其中包含“ALL”字符串的单元格的行,而不是整个dataGrid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多