如果数值较大,绑定到gridview的Linq结果将无法正确显示



我在网格视图中显示的结果与调试时显示的结果不同。

搜索一个过滤结果的网格视图,它似乎只有在数字低于几百的情况下才有效。

例如,搜索rank,其中rank =='10'导致具有所有rank == 10的存储过程总数607。linq到sql的调试结果完全相同。

当结果绑定到网格视图并显示时,它们看起来是正确的,直到您进入显示结果的第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条所有秩为10的记录。至少我从你的描述中了解到了这一点。如果是,那么为什么要过滤10?但是,如果它返回所有记录,则可能是筛选问题。

由于它是IEnumerable,我们可以排除SQL可能出现的问题。

然后,为了进行故障排除,我将首先同时输出所有结果,最好是在page_load上。要么禁用分页,要么简单地用foreach迭代所有记录并将它们写入响应。这样,您就可以确定运行时返回的内容是否是您所需要的,并消除网格和回发可能出现的问题。

然后我会检查你的页码。由于您似乎依赖于视图状态来为您进行分页,我会确保检查它的大小。.NET中post的默认最大请求长度设置为4MB(maxRequestLength=4096),但可以想象您的web服务器配置了一个较小的值。这可能会以某种方式破坏它。尽管我认为在这种情况下你会得到一个例外。

最后,我会禁用视图状态,而是检索每个分页的所有数据,然后简单地执行.Skip(…).Take(…)。但我觉得你的帖子中有些地方缺少信息。

最新更新