如何以编程方式在ASP.NET 4.0 GridView上启用分页和排序?

我使用ASP.NET 4.0与C#(Visual Web Developer 2010 Express)。

我已成功设法使用声明性ASP.NET代码实现绑定到存储过程数据源的简单GridView,如下所示:

       <asp:SqlDataSource ID="sdsTrades" runat="server" ConnectionString="" ProviderName="" SelectCommand="usp_GetTrades" SelectCommandType="StoredProcedure">  

它工作得很好,包括分页和排序。 我想删除SqlDataSource并使用代码隐藏(我试图将数据库访问代码放在一个地方)。 到目前为止,我在我的代码隐藏中有这个:

 protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { grdTrades.SelectedIndex = 0; DBUtil DB = new DBUtil(); grdTrades.DataSource = DB.GetTrades(); grdTrades.DataKeyNames = new string[] { "tradeId" }; grdTrades.DataBind(); } } // this is needed otherwise I get "The GridView 'grdTrades' fired event PageIndexChanging which wasn't handled." void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) { grdTrades.PageIndex = e.NewPageIndex; grdTrades.DataBind(); } 

我的声明代码现在看起来像:

        

问题是,当我点击页码时,页面变为空白。 我还想实现排序,但希望首先使分页工作。 请帮忙。

谢谢

每次更改页面时都需要绑定GridView。

例如:

 void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) { grdTrades.DataSource = DB.GetTrades(); grdTrades.PageIndex = e.NewPageIndex; grdTrades.DataBind(); } 

我的建议是将结果存储在ViewState(或Cache DB.GetTrades()中的DB.GetTrades()中,这样每次更改页面时都不需要转到数据库。

但是,在执行此操作时,排序会变得非常困难。

您始终可以使用ObjectDataSource而不是SqlDatasource。 然后,您可以指向ObjectDataSource以查看DB.GetTrades()函数。 排序和分页将自动运行。

希望有所帮助。

您可以创建一种方法来绑定网格视图,而不是在分页中再次绑定它。 通过创建绑定网格视图的方法,您始终可以调用方法以随时绑定网格视图。

 protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { BindgrdTrades(); } private void BindgrdTrades() { DBUtil DB = new DBUtil(); grdTrades.DataSource = DB.GetTrades(); grdTrades.DataKeyNames = new string[] { "tradeId" }; grdTrades.DataBind(); } } void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) { grdTrades.PageIndex = e.NewPageIndex; BindgrdTrades(); } } 

我不得不让我的_PageIndexChanging计数器公开(我在asp.net上这么新,我不知道为什么这很重要)。 该页面将通过一个错误说它无法找到该类。 这些post对于使用其他接近逐字逻辑的分页工作有很大帮助。 感谢所有海报花时间如此清晰地展示出来。 这是我最终得到的代码:

 public partial class Requests : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { BindgrdBuilds(); } } private void BindgrdBuilds() { // Link GridView to datasource GridView1.DataSource = BuildData.getBuilddata(); // Bind SQLDataSource to GridView after retrieving the records. GridView1.DataBind(); } public void GridView1_PageIndexChanging(Object sender, GridViewPageEventArgs e) { // increment PageIndex GridView1.PageIndex = e.NewPageIndex; // bind table again BindgrdBuilds(); } } 

我坚持使用AutoGenerated列,我正在对我上面没有包含的cs页面上的数据进行一些行绑定,但这里是我的GridView的asp代码:

    

我希望其他人可以利用这些信息,这个post是一个很好的,简单的例子。 现在,分页工作是时候得到真正的幻想并为GridView1:D提出一个新名称