【问题标题】:Is it impossible to declaratively data bind the CssClass property on ItemStyle inside GridView?是否不可能在 GridView 内以声明方式数据绑定 ItemStyle 上的 CssClass 属性?
【发布时间】:2023-03-18 12:06:01
【问题描述】:

我正在尝试基于 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 条目的行,如下所示:

&lt;td class="style1 &lt;%= Lib.Web.StyleHelper.Festivity.ToString() %&gt;" &gt;

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

&lt;td class="style1 PartyMode" &gt;

【问题讨论】:

  • 你能发布一些例子吗?
  • 您是否使用!important 来覆盖任何未知/看不见的应用样式?
  • @MadSkunk 已发布——希望对您有所帮助。
  • @bobthyasian 我不这么认为。这不是选择器匹配失败的问题,而是绑定代码没有被解析。有趣的是,尽管代码中的标识符在 Visual Studio 中像字符串一样着色,但 标签仍然像服务器端脚本一样着色。所以看起来VS仍然看到它?不知道发生了什么。
  • @bwerks 我只是在猜测。这通常是问题所在。

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


【解决方案1】:

你不能那样做。您可以做的是创建两个不同的皮肤。在皮肤中,您可以设置与现在相同的 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";
        }

【讨论】:

  • 事实证明这是可能的,无需代码隐藏。看我的回答。
【解决方案2】:

我找到了我要找的东西。它几乎完全来自this article,它讨论了使用 构造的 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 ”
  • 在这种情况下,值必须使用单引号,因为字符串构造中使用了双引号。

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

【讨论】:

  • 不好的做法。没有建设性。难以维护。
  • 很好的答案,因为我不知道这是可能的。但我选择在代码后面而不是使用GridView.Columns[i].ItemStyle.CssClass
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2015-06-16
  • 2016-09-22
  • 2010-10-30
  • 2013-09-11
相关资源
最近更新 更多