【问题标题】:GridView Style based on bound data基于绑定数据的GridView样式
【发布时间】:2010-04-30 14:20:00
【问题描述】:

我希望 GridView 的行根据名为 IsObsolete 的绑定数据值添加删除线。我试图这样做:

<RowStyle BackColor="#EFF3FB" Font-Strikeout='<%# Bind('IsObsolete') %>' />

但显然这不能解析。我宁愿不在 GridView.DataBound() 中这样做。还有其他想法吗?

【问题讨论】:

  • 你在网格中的列是动态绑定的吗?
  • @CAbbott:使用ItemDataBound 会非常困难,特别是因为GridView 没有这个方法。 :)
  • @Myra nope,来自使用 SqlDataSource 的数据库。如果是的话,这会更容易。
  • 确实不能用表达式解析特殊属性。它们是动态的,但要使其动态,您必须调用服务器端代码行 CAbbott 或 javascript 来解析,这将使您的网格慢慢来。你应该选择一种方式。
  • 糟糕,我的意思是RowDataBound。这就是我即兴发表评论的结果。 :)

标签: asp.net gridview coding-style strikethrough


【解决方案1】:

我通过在模板中我的一个控件的DataBinding 事件上应用样式来做到这一点。示例:

<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="SomeTitle">
            <ItemTemplate>
                <asp:HyperLink ID="hrefYourLink" runat="server"
                    NavigateUrl="Somepage.aspx?id={0}" 
                    OnDataBinding="hrefYourLink_DataBinding"></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

然后实现OnDataBinding事件:

protected void hrefYourLink_DataBinding(object sender, System.EventArgs e)
{            
    HyperLink link = (HyperLink)(sender);
    GridViewRow row = (GridViewRow)(link.Parent.Parent);
    if ((bool)(Eval("IsObsolete"))
    {
        row.CssClass = "StrikeThroughStyle";
    }
    link.Text = HttpUtility.HtmlEncode(((int)(Eval("ID"))).ToString());
    link.NavigateUrl = string.Format(link.NavigateUrl, Eval("ID").ToString());
}

这只是一个简单的示例,其中包含一个链接的列也可以根据数据绑定进行修改,但是如果根据您的需要进行调整,您应该能够获得要点。我喜欢在数据绑定上这样做,因为我在我的 aspx 代码中没有内联绑定。

【讨论】:

  • @Matthew Jones 你有没有想过这个问题?如果您需要更多帮助,请发表评论或编辑您的问题,我会看看我能做什么。
【解决方案2】:

由于 RowStyle 元素适用于整个网格,因此完成您想要的唯一方法是为所有列设置 TemplateItems 并根据相同的数据值将 CssClass 应用于每列。

我不确定您为什么要避免 DataBound 事件来执行此操作,因为这是完成它的最简单方法。

您也可以尝试使用格式化函数和 itemstyles。从上面窃取一些代码并对其进行更改:

<%

public string GetObsoleteClass(string obsolete)
{
    bool obs = Convert.ToBoolean(obsolete);
    obs ? return "myObsoleteClass" : return "myNotObsoleteClass";
}

%>
<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="SomeTitle">
            <ItemTemplate>
                <asp:HyperLink ID="hrefYourLink" runat="server"
                    NavigateUrl="Somepage.aspx?id={0}" 
                    OnDataBinding="hrefYourLink_DataBinding"></asp:HyperLink>
            </ItemTemplate>
              <itemstyle CssClass='<%# Eval("isObsolete") %>'>
              </itemstyle>
        </asp:TemplateField>
        <asp:boundfield
            sortexpression="LastName"
            datafield="LastName"
            headertext="LastName">
              <itemstyle CssClass='<%# Eval("isObsolete") %>'>
              </itemstyle>
        </asp:boundfield>
    </Columns>
</asp:GridView>

【讨论】:

  • Css 可以在 Row 级别设置,不需要单独设置每个项目,除非您想覆盖某些内容。我也对项 DataBinding 事件执行此操作,因为我通常至少定义了其中一个,并且很少实现任何其他 DataBound 事件,因此很容易将其添加到第一个项 DataBinding 事件中。此外,如果您想为整行着色不同的颜色,我的方法效果很好。
  • @Kelsey - 这就是他想要做的 - 覆盖一些东西。我同意使用事件是首选方法,但他在问题中明确表示不想使用事件。
猜你喜欢
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2012-02-01
相关资源
最近更新 更多