2009-01-06 137 views
1

我有一个数据表,它返回大约30,000条记录。我在ASP中显示这些记录:GridView控件。我有一个下拉控件,我希望用户能够选择要在GridView中显示的记录数。默认值应该是All,但也可以有20,50,100等值。我不太确定如何做到这一点。根据下拉菜单显示gridview中的结果数量?

如果我没有启用Paging,该怎么办? PageSize仍然有效吗?

我硬编码GridView.PageSize = 1,它仍然返回所有记录。

+0

当他们只选择数据的子集,意味着什么每页100个,还是100个? – BFree 2009-01-06 20:30:22

+0

这意味着100总数。我禁用了分页功能。 – Xaisoft 2009-01-06 20:32:43

+0

世界上没有一个用户可以一次理解30k行。我最多可以将它设置为100,并允许在任何列上进行排序。然后,如果他们只想一次看到X,则可以更改页面大小的值。 – jcollum 2009-01-06 22:23:45

回答

2
采取

如果你想让PageSize工作,来设置GridView的AllowPaging为true。 显然你必须创建管理事件PageIndexChanging的方法。

像这样:

protected void myGvw_OnPageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    myGvw.PageIndex = e.NewPageIndex; 
    // then recall the method that bind myGvw 
} 

下拉本来属性的AutoPostBack设置为true,并在他的OnSelectedIndexChanged您必须设置

myGvw.PageSize = Convert.ToInt32(myDropDown.SelectedValue) 
2

您可以将下拉列表中的值(20,50,100)添加到查询中,以便只选择顶部(20,50,100)记录。

你打算使用分页吗?

1

这是我会做的。首先,我会向DataTable添加一列,如果它不在那里,它将作为计数器。然后,将您的GridView绑定到DataView。下面是一些代码来证明什么,我说什么:

  //add column with counter 
      table.Columns.Add("counter", typeof(int)); 
      for (int i = 0; i < table.Rows.Count; i++) 
      { 
       table.Rows[i]["counter"] = i+1; 
      } 

然后,得到DataTable中的默认视图,设置的RowFilter:

  DataView view = table.DefaultView; 
      view.RowFilter = "counter <= 100"; //or whatever number the user selected 

最后,只是在GridView直接绑定到数据视图。

2

在数据选择中应该尽可能早地处理分页。您不想从数据库检索30,000条记录到应用程序服务器,然后只显示其中的50条记录。

喜欢的东西:(选择第3页,每页50条)

select top 50 from x where pk not in (select top 100 pk from x) 

意为:

CREATE PROCEDURE sspGetItems (@pageSize int, @pageNum int) 
AS 
SELECT TOP @pageSize 
FROM x 
WHERE pk NOT IN 
(
SELECT TOP (@pageNum - 1) * @pageSize pk FROM x 
) 

显然更关心将需要大约排序等