是否无法以声明方式将数据绑定到GridView内的ItemStyle上的CssClass属性?

时间:2012-12-15 01:55:55

标签: asp.net css visual-studio data-binding gridview

我正在尝试以编程方式在GridView中基于CSS类元素切换页面上的样式。我已经成功地在几个正常(非模板化)元素的类属性中完成了这个,但由于某种原因它似乎在模板控件中不起作用。 Visual Studio将数据绑定代码视为不透明文本(实际上,甚至将其作为不透明字符串进行着色)。以这种方式不支持数据绑定吗?

我在类文档中找不到任何说明这种情况的内容,但另一方面它不起作用,Visual Studio似乎暗示这是按照设计的。

编辑:一个例子。这里声明了Gridview,在列定义中,ItemStyle-CssClass属性设置为两个值;一个是硬编码的,另一个是从枚举变量的当前值中获取的。假设在这种情况下,StyleHelper是一个静态类,Festivity属性的类型为StyleSelectorEnum,当前值为StyleSelectorEnum.PartyMode。

<asp:GridView runat="server">
    <Columns> 
        <asp:TemplateField ItemStyle-CssClass="style1 <%= Lib.Web.StyleHelper.Festivity.ToString() %>" />
            <ItemTemplate>
                <div />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

在此示例中,生成的表将包含具有td条目的行,如下所示:

<td class="style1 <%= Lib.Web.StyleHelper.Festivity.ToString() %>" >

在实践中,我希望它看起来像这样:

<td class="style1 PartyMode" >

2 个答案:

答案 0 :(得分:2)

我找到了我要找的东西。它几乎完全来自this article,它使用&lt;%$%&gt;讨论ASP.NET Expression Builders。构造。在我的示例中,解决方案如下。

标记:

<asp:GridView runat="server">
    <Columns> 
        <asp:TemplateField>
            <ItemStyle CssClass='<%$ Code: "style1 " + Lib.Web.StyleHelper.Festivity.ToString() %>' />
            <ItemTemplate>
                <div />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

需要注意的事项:

  • ItemTemplate上的ItemStyle-CssClass属性不能以这种方式使用。文字内容错误导致。
  • &lt;%$%&gt;构造必须填充整个值,这意味着在我的情况下在其中执行字符串构造,而不是“style1&lt;%$ Code:...%&gt;”
  • 在这种情况下,由于字符串构造中使用了双引号,因此必须使用单引号。

在web.config中声明表达式构建器的部分:

<compilation debug="true">
    <expressionBuilders>
        <add expressionPrefix="Code" type="CodeExpressionBuilder"/>
    </expressionBuilders>
</compilation> 

类定义本身,放在app_code中:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
    {
        return new CodeSnippetExpression(entry.Expression);
    }
}

现在,结果表中的td元素按预期给出了“style1 PartyMode”类。

这个解决方案的全部功劳归功于他的博客中的InfinitiesLoop;我做了很少的工作来适应我的目的。

答案 1 :(得分:0)

你做不到。你可以做的是创建两个不同的皮肤。在皮肤中,您可以设置与现在相同的css字段。所以你创建一个没有PartyMode的皮肤和一个皮肤。您可以在Page_PreInit

中设置所需的皮肤

在皮肤文件中:

<ASP:GridView SkinId="Simple">
    <ItemStyle CssClass="style1"/>
</ASP:GridView>

<ASP:GridView SkinId="Party">
    <ItemStyle CssClass="style1 PartyMode"/>
</ASP:GridView>

在你的aspx中:

<asp:GridView Id="GridView1" runat="server" SkinID="Simple">

在你的代码背后:

protected override void OnPreInit(EventArgs e)
        {
            base.OnPreInit(e);

// based on your condition:
this.GridView1.SkinID = "PartyMode";
        }