我有一个棘手的小问题,我输出审计线索,需要突出显示每条记录的更改。
我目前正在使用Linq-to-Sql数据源将审计数据拉回来,然后使用转发器将其显示在表格中。
问题是我需要更改单元格的背景颜色,如果它的值已经从之前的记录改变了,我正在努力找到一种方法来做到这一点。
我考虑过的一个替代方案是简单地生成可以工作的整个表格,但我感觉必须有一个更简单的方法来做到这一点。
有什么想法吗?
答案 0 :(得分:2)
您可以使用ItemDataBound
事件检查项目绑定时的值。此时,您可以检查前一个单元格的值,如果不同,请为其添加CssClass
具有所需格式的文件。
答案 1 :(得分:2)
我知道这是一个老问题,但要为知识库做出贡献,因为我也觉得这很棘手。
声明性解决方案是访问先前的DataListItem
((DataList)Container.Parent).Items[Container.ItemIndex-1]
然而,不幸的是,它的DataItem属性似乎为null,因此您无法评估先前DataItem的属性(例如,执行与当前DataItem的属性的比较)。
例如,这不起作用:
<%# ( DataBinder.Eval((((DataList)Container.Parent).Items[Container.ItemIndex-1]).DataItem, "SomeProperty") ) == Eval("SomeProperty") ) ? "SAME" : "DIFFERENT" %>
但是,您可以使用ListItem.FindControl访问上一项中的控件并访问控件内容。
(Eval("SomeProperty").ToString() == ((Label)(((DataList)Container.Parent).Items[Container.ItemIndex-1].FindControl("LabelBoundToSomeProperty"))).Text) ? "SAME" : "DIFFERENT"
最后,一个问题 - 当绑定第一个项目时,没有先前的项目,因此您将获得索引超出范围的异常。因此,您只需先检查您是否在第一项中。
全部使用togetehr为您提供最终的纯粹声明性解决方案:
<%# (Container.ItemIndex==0) ? "FIRST" : (Eval("SomeProperty").ToString() == ((Label)(((DataList)Container.Parent).Items[Container.ItemIndex-1].FindControl("LabelBoundToSomeProperty"))).Text) ? "SAME" : "DIFFERENT" %>
以上内容将说明我们是在第一项,还是在后续项目中,所选属性是上一项中该属性的SAME还是DIFFERENT。
(p.s。第一次SO提交 - 长期读者,第一次作者:)
答案 2 :(得分:0)
选择数据项集合并将其保存到具有受保护的get属性的类变量中。数据项的集合需要键入索引。然后在运行时将GridView数据绑定到数据项集合。
然后你应该能够使用类似
的标签访问asp.net中的上一个项目<%# this.DataItems[Container.DataItemIndex] == this.DataItems[Container.DataItemIndex] ? "same as previous item" : "different than previous item" %>
答案 3 :(得分:0)
在页面类中创建一个字段:
private int previousValue;
然后在ItemCreated或ItemDataBound事件中:
int currentValue = << get current value >>;
if (previousValue != currentValue) {
<< do highlight >>;
previousValue = currentValue;
}
答案 4 :(得分:0)
必须玩之后我发现手动生成html最快。
我忘了在原始问题中提到我必须将顺序颠倒到记录(即最近的第一个),因此在转发器事件中对记录进行设置变得更加困难,例如添加具有的第一条记录,以显示颜色编码的单元格以指示更改,但此时未写入下一条记录,因此您无需进行比较。
最简单的方法似乎是遍历后面代码中的记录,然后将属性与属性进行比较,然后根据该样式创建带有样式的html。
感谢所有花时间查看问题并提出解决方案的人。
答案 5 :(得分:0)
在中继器之前添加一个默认值的隐藏字段,根据您的目的将每个值与隐藏字段值进行比较,并在中继器的末尾使用新值设置隐藏字段值,如下所示:
<asp:HiddenField ID="hf" runat="server" Value="0" />
<asp:Repeater ID="rptHistory" runat="server" DataSourceID="dsHistory">
<ItemTemplate>
<div class='time-label <%# Convert.ToDateTime(Eval("AddDate")).Date.ToString() == hf.Value ? "d-none" : "" %>'>
<span class="bg-info">
...
</span>
</div>
<div>
...
</div>
<span class="d-none"><%# hf.Value = Convert.ToDateTime(Eval("AddDate")).Date.ToString() %></span>
</ItemTemplate>
</asp:Repeater>