У меня есть GridView, использующий LinqDataSource
для заполнения данных из таблицы Tickets
.LinqDataSource
имеет AutoGenerateWhereClause="True"
, так что предложение where может быть построено динамически следующим образом:
<asp:LinqDataSource ID="dsGridView" runat="server" AutoGenerateWhereClause="True"
ontextTypeName="TicketsDataContext" TableName="Tickets" OrderBy="ID Descending"
EnableDelete="True" OnSelecting="dsGridView_Selecting">
<WhereParameters>
<asp:SessionParameter Name="AssignedTo" SessionField="user"/>
<asp:Parameter Name="Department" DefaultValue="" />
<asp:Parameter Name="Category" DefaultValue="" />
</WhereParameters>
</asp:LinqDataSource>
Параметры Where используются с фильтрами раскрывающегося списка в заголовке вида сетки.Они могут быть нулевыми, так что dsGridView будет возвращать все записи.
В моем сеточном представлении включена подкачка.
В Table Ticket есть поле с именем TimeSpent
.Я хотел бы рассчитать общую сумму TimeSpent
для всех отфильтрованных билетов и отобразить ее в нижнем колонтитуле.
Я мог бы использовать Linq2SQL
на gridView_DataBound
, чтобы запросить ВСЕ билеты на TimeSpent.Тем не менее, я запутался, как получить общий TimeSpent при фильтрации сетки.
Я пытался получить билеты от LinqDataSourceSelectEventArgs.Result
, но он вернул только общее TimeSpent для текущей страницы gridview, а не длявся таблица.
Проблема в том, что я не знаю, сколько параметров будет отображаться в событии выбора.Отдел может быть нулевым и не отображаться в WhereParameters, как и Категория.
Примерно так:
TicketsDataContext db = new TicketsDataContext();
var query = from ticket in db.Tickets select ticket;
foreach (var param in dsGridView.WhereParameters
{
if (!string.IsNullOrEmpty(param.Value))
query.query.Where(...)
}
Не работает, конечно.Есть ли идея, как я мог бы решить эту проблему?Заранее спасибо!
Обновлено : я снова использовал данные, возвращенные из dsGridView в OnSelected
событии, как показано ниже:
protected void dsGridView_Selected(Object sender, LinqDataSourceStatusEventArgs e)
{
var totalTime = (e.Result as List<Ticket>).Sum(t => t.TimeSpent);
grvTickets.Columns[7].FooterText = "Sum: " + totalTime.ToString();
}