我的gridview适用于900多条记录。但我添加了一个新列,用于计算每行日期的天数。它需要今天的日期并计算自数据库返回日期以来的天数。
摘要示例:
-------------------------------
| Something | Date | Days |
-------------------------------
| A | 3/1/2015 | 2 |
| B | 3/1/2014 | 365 |
-------------------------------
我 OnRowDataBound 每行到RowDataBound来自定义标签文本
protected void gvView_RowDataBound (object sender, GridViewRowEventArgs e) {
Label daysInCycle = (Label)e.Row.Cells[0].FindControl("lblDays");
if (e.Row.RowType == DataControlRowType.DataRow) {
DataRowView ThisRow = (DataRowView)e.Row.DataItem;
if (ThisRow.Row.Field<DateTime?> ("MyDate").HasValue) {
TimeSpan ts = DateTime.Now - ThisRow.Row.Field<DateTime>("MyDate");
daysInCycle.Text = ts.Days.ToString();
} else {
daysInCycle.Text = "N/A";
}
}
}
在.aspx文件中的gridview中
<asp:TemplateField HeaderText="Days">
<ItemTemplate>
<asp:Label ID="lblDays" runat="server" Text="NA"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
有关为什么我的gridview / IE会变得无法响应并且在包含 TimeSpan 后挂起的任何想法?如果我取出TimeSpan计算,gridview将返回其正常的响应自我。
答案 0 :(得分:0)
我没有看到任何导致挂起的事情。但是您不需要在每个RowDataBound
事件中创建一个新的Now()实例。
将datetime变量声明为页面类的成员变量:
DateTime TimeStamp;
在DataBinding
事件中,将变量设置为DateTime.Now:
TimeStamp = DateTime.Now;
然后在RowDataBound
中使用变量而不是调用Now()。
Label daysInCycle = (Label)e.Row.Cells[0].FindControl("lblDays");
daysInCycle.Text = "N/A";
if (e.Row.RowType == DataControlRowType.DataRow) {
DataRowView ThisRow = (DataRowView)e.Row.DataItem;
if (ThisRow.Row.Field<DateTime?> ("MyDate").HasValue) {
TimeSpan ts = TimeStamp - ThisRow.Row.Field<DateTime>("MyDate");
daysInCycle.Text = ts.Days.ToString();
}
}