如何根据绑定行的Object的属性设置GridView行的RowStyle

时间:2010-01-20 15:12:39

标签: asp.net gridview

我目前正在使用GridView,我想根据行所绑定的对象的属性为Row设置CssClass。

我尝试了以下但是它不起作用(见评论):

<asp:GridView id="searchResultsGrid" runat="server" AllowPaging="true" PageSize="20" AutoGenerateColumns="false">

<!-- The following line doesn't work because apparently "Code blocks 
aren't allowed in this context: -->
  <RowStyle CssClass="<%#IIF(DataBinder.Eval(Container.DataItem,"NeedsAttention","red","") %>

  <Columns>
<!--............-->
  </Columns>
</asp:GridView>

现在我可以简单地处理GridView的RowDataBound事件并更改那里的行的css类......但是我试图在UI和页面/业务逻辑层之间保持清晰的分离。

我不知道如何做到这一点,我期待听到任何建议。

谢谢,

-Frinny

3 个答案:

答案 0 :(得分:4)

您无法在声明性标记中执行此操作。

几乎所有GridView的声明性属性(包括GridView.RowStyle)都是网格级设置而不是行级。除了TemplateFields之外,它们不是绑定数据容器,因此它们无法访问其行中的数据。

如果您想将此逻辑保留在.aspx模板中,您唯一真正的选择是使用模板字段并操纵其内容:

<asp:TemplateField>
    <ItemTemplate>
        <span class="<%# ((string)Eval("property3")) == "NeedsAttention" ? "red" : string.Empty %>">
            <%# Eval("property1") %>
        </span>
    </ItemTemplate>                        
</asp:TemplateField>

根据您的目的,这可能很尴尬 - 您无权访问包含<td>(或<tr>的内容),您必须重复格式化对于每个细胞。

GridView类需要花费很多时间来隐藏HTML和样式的细节。毕竟,可以创建一个甚至不会呈现为HTML表格的GridView control adapter。 (虽然可能不太可能。)

所以即使你试图避免它,你可能最好在OnRowDataBound处理程序中处理这个问题 - 或者使用Repeater(如果这是合适的话)。

答案 1 :(得分:2)

我知道已经差不多一年了,但是如果其他人试图这样做,请尝试继承GridView。

public class GridViewCSSRowBindable : GridView
{
  public string DataFieldRowCSSClass { get; set; }
  protected override void OnRowDataBound(GridViewRowEventArgs e)
  {
    base.OnRowDataBound(e);
    if (!string.IsNullOrEmpty(DataFieldRowCSSClass))
    {
      //This will throw an exception if the property does not exist on the data item:
      string cssClassString = DataBinder.Eval(e.Row.DataItem, DataFieldRowCSSClass) as string;
      if (!string.IsNullOrEmpty(cssClassString))
      {
        string sep = string.IsNullOrEmpty(e.Row.CssClass) ? string.Empty : " ";
        e.Row.CssClass += sep + cssClassString;
      }
    }
  }
}

然后在你的页面中:

<custom:GridViewCSSRowBindable ID="gvExample" runat="server" DataFieldRowCSSClass="RowCSS">
</custom:GridViewCSSRowBindable>

绑定到此示例GridView的对象应具有公共字符串RowCSS属性。

如果您之前没有使用过继承控件,则可能需要查找如何在项目中进行设置。

答案 2 :(得分:0)

foreach (TableCell gvc in gvRowPhistry.Cells)
{
    gvc.ForeColor = System.Drawing.Color.Blue;
}