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

Mar*_*son 20 c# asp.net gridview

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

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

<asp:GridView 
    ID="grdTrades" 
    runat="server" 
    DataKeyNames="tradeId" 
    EnablePersistedSelection="true"
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="false" 
    DataSourceID="sdsTrades" 
    >
    <Columns>
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
        <asp:BoundField DataField="tradeId" HeaderText="TradeId"  ReadOnly="True" SortExpression="tradeId" />
        < ... more columns ... >
    </Columns>
</asp:GridView>

<asp:SqlDataSource ID="sdsTrades" runat="server" 
    ConnectionString="<%$ ConnectionStrings:TradesDB %>" 
    ProviderName="<%$ ConnectionStrings:Trades.ProviderName %>"  
    SelectCommand="usp_GetTrades" SelectCommandType="StoredProcedure">      
</asp:SqlDataSource>
Run Code Online (Sandbox Code Playgroud)

它工作得很好,包括分页和排序.我想删除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();
}    
Run Code Online (Sandbox Code Playgroud)

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

<asp:GridView 
    ID="grdTrades" 
    runat="server" 
    EnablePersistedSelection="true"            
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="false" 

    OnPageIndexChanging="grdTrades_PageIndexChanging"
    >
    <Columns>
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
        <asp:BoundField DataField="tradeId" HeaderText="TradeId"  ReadOnly="True" SortExpression="tradeId" />
        < ... more columns ... >           
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jam*_*mie 29

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

例如:

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

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

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

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

希望有所帮助.