基于以前记录的Asp.Net转发器格式项

时间:2010-01-06 21:27:27

标签: asp.net css repeater

我有一个棘手的小问题,我输出审计线索,需要突出显示每条记录的更改。

我目前正在使用Linq-to-Sql数据源将审计数据拉回来,然后使用转发器将其显示在表格中。

问题是我需要更改单元格的背景颜色,如果它的值已经从之前的记录改变了,我正在努力找到一种方法来做到这一点。

我考虑过的一个替代方案是简单地生成可以工作的整个表格,但我感觉必须有一个更简单的方法来做到这一点。

有什么想法吗?

6 个答案:

答案 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>