我有一个 GridViewLinqDataSource
用于从表中填充数据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 将返回所有记录。
我的 gridview 启用了分页。
Table Ticket 有一个名为 的字段TimeSpent
。我想计算TimeSpent
所有过滤的票的总数并将其显示在页脚上。
我可以使用Linq2SQL
ongridView_DataBound
来查询所有门票的 TimeSpent。但是,我很困惑如何在过滤 gridview 时获得总 TimeSpent。
我试图从 获取票证LinqDataSourceSelectEventArgs.Result
,但它只返回 gridview 当前页面的总 TimeSpent,而不是整个表。
问题是,我不知道 Selecting 事件中会出现多少 Where 参数。Department 可以为 null 且不显示在 WhereParameters 中,Category 也可以。
像这样的东西:
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(...)
}
当然不起作用。有什么想法可以解决这个问题吗?提前致谢!
更新:我最终在OnSelected
事件中重用了从 dsGridView 返回的数据,如下所示:
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();
}