绑定到gridview的Linq结果如果数目很高,则不能正确显示
我在GridView中看到的显示结果不同于我在调试时出现的结果。绑定到gridview的Linq结果如果数目很高,则不能正确显示
Theres搜索一个gridview过滤结果,它似乎只有在数字少于几百时才起作用。
例如,搜索rank
,其中rank =='10'
导致存储过程总计607与所有rank == 10
。 linq to sql的结果是完全一样的调试。
时,结果被绑定到GridView并显示他们似乎是正确的,除非你页面的结果10显示,然后结果是不正确的,这意味着rank != 10
结果出现较小的正确结果集..不知道发生了什么事。
这里的代码
DataTable getEmployeeResults = employee.FullEmployeeRoster();
var results = (from row in getEmployeeResults.AsEnumerable()
select new EmployeeRow
{
EmployeeId = row.Field<int?>("EmployeeID"),
Rank = row.Field<string>("Rank"),
Name = row.Field<string>("Name"),
WorkEmail = row.Field<string>("Email"),
DutyStation = row.Field<string>("StationName"),
Directorate = row.Field<string>("Directorate"),
BranchService = row.Field<string>("Branch"),
Active = ConvertToBool(row.Field<int>("Active"))
});
if (this.ddRank.SelectedValue != "")
{
results = results.Where(x => x.Rank == this.ddRank.SelectedItem.Text);
}
if (this.chkInactive.Checked)
{
results = results.Where(x => x.Active == false);
}
else
{
results = results.Where(x => x.Active == true);
}
this.gridEmployees.DataSource = results.ToList();
this.gridEmployees.DataBind();
这是很难在这里给一个很好的答案所提供的信息是有点不清楚。
我假设FullEmployeeRoster是一个存储过程,它返回607条记录,所有的rank == 10。至少这是我从你的描述中收集到的。如果是这样,那么为什么过滤10?但是,如果它返回全部记录,那么它可能是过滤问题。
由于它是IEnumerable,我们可以排除SQL可能存在的问题。
然后要排除故障,我会首先输出全部结果,最好在page_load上。要么禁用分页,要么只是用foreach遍历所有记录,并将它们写入响应。这样您就可以确定地知道在运行时返回的内容是否是您需要的,并消除了网格和回发可能出现的问题。
然后我会检查你的分页。既然看起来你依赖视图状态为你做分页,我会确保检查它的大小。 .NET中post的默认最大请求长度设置为4MB(maxRequestLength = 4,096),但可以想象,您的Web服务器配置的值较小。这可能会以某种方式破坏它。虽然我认为在这种情况下你会得到一个例外。
最后,我将禁用视图状态,而是检索每个分页的所有数据,并简单地执行.Skip(...).Take(...)。但我有一种感觉,在你的文章中某处缺少信息。
你是正确的,有一些隐藏的东西。我现在觉得自己像个白痴,那是分页。我的变量名拼写错误:/我在代码中上下颠倒,完全忽略了一个微小的细节...... – Avien 2012-07-12 15:17:08
上面的代码在每次回发时都从page_load调用? – 2012-07-10 21:38:54
不,代码在点击按钮上调用 – Avien 2012-07-10 21:41:55
@sneakthief:当它出现问题与ASP.NET相关时,为什么将它标记为winforms和datagridview? – Ruslan 2012-07-10 21:51:37