我正在尝试以编程方式在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" >
答案 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>
需要注意的事项:
在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";
}