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

Fri*_*ale 5 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>
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

-Frinny

Jef*_*nal 5

您不能在声明性标记中执行此操作。

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

如果你想在 .aspx 模板中保留这个逻辑,你唯一真正的选择是使用模板字段并操作它们的内容:

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

根据您想要做什么,这可能会很尴尬 - 您无权访问包含<td>(或<tr>就此而言),您必须重复每个单元格的格式。

GridView班去了很多的长度隐藏的HTML的细节和你的造型。毕竟,您可以创建一个甚至不会呈现为 HTML 表格的GridView 控制适配器。(虽然这可能是不太可能的。)

因此,即使您试图避免它,您最好OnRowDataBound还是在处理程序中处理它 - 或者使用 a Repeater(如果合适的话)。