3

我正在尝试基于 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" >

4

2 回答 2

2

我找到了我要找的东西。它几乎完全来自这篇讨论使用 <%$ %> 构造的 ASP.NET 表达式构建器的文章。在我的示例中,解决方案如下。

标记:

<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 属性不能以这种方式使用。导致文字内容错误。
  • <%$ %> 构造必须填充整个值,这意味着在我的情况下在其中进行字符串构造,而不是“style1 <%$ Code: ... %>”
  • 在这种情况下,值必须使用单引号,因为字符串构造中使用了双引号。

在 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;我做了很少的工作来适应我的目的。

于 2012-12-16T00:33:09.547 回答
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";
        }
于 2012-12-15T06:28:13.597 回答