我目前正在使用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
答案 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;
}