2015-03-03 1 views
0

Мой сетчатый просмотр отлично работает с 900 + записями. Но я добавил новый столбец, который вычисляет дни в каждой строке. Он принимает сегодняшнюю дату и вычисляет количество дней с даты, возвращаемой из БД.ASP Gridview замедляется с рекордным счетом более 150 после добавления TimeSpan

Аннотация Пример:

------------------------------- 
| Something | Date  | Days | 
------------------------------- 
| A  | 3/1/2015 | 2 | 
| B  | 3/1/2014 | 365 | 
------------------------------- 

I 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"; 
       } 
      } 
     } 

И в моей GridView в файле .aspx

<asp:TemplateField HeaderText="Days"> 
       <ItemTemplate> 
        <asp:Label ID="lblDays" runat="server" Text="NA"></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

Любые идеи о том, почему мой gridview/IE перестанет отвечать на запросы и просто повесить после включения TimeSpan? Если я выберу расчет TimeSpan, gridview вернется к своему нормальному самочувствию.

ответ

0

Я не вижу ничего, что могло бы повредить. Но вам не нужно создавать новый экземпляр Now() в каждом событии RowDataBound.

Объявите переменную типа 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(); 
    } 
}