web-dev-qa-db-fra.com

Comment activer la pagination et le tri sur ASP.NET 4.0 GridView par programme?

J'utilise ASP.NET 4.0 avec C # (Visual Web Developer 2010 Express).

J'ai réussi à implémenter un GridView simple lié à une source de données de procédure stockée à l'aide du code déclaratif ASP.NET comme indiqué ici:

<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>

Cela fonctionne très bien, y compris la pagination et le tri. Je veux supprimer le SqlDataSource et utiliser le code-behind (j'essaie de mettre le code d'accès à la base de données en un seul endroit). Jusqu'à présent, j'ai ceci dans mon code-behind:

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();
}    

Mon code déclaratif ressemble maintenant à:

<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>

Le problème est que lorsque je clique sur un numéro de page, la page devient vierge. Je voudrais également implémenter le tri, mais je voudrais que la pagination fonctionne en premier. Veuillez aider.

Merci

20
Mark Allison

Vous devez lier votre GridView chaque fois que vous changez de page.

Par exemple:

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

Mon conseil serait de stocker vos résultats depuis DB.GetTrades() dans ViewState (ou Cache) afin que vous n'ayez pas besoin d'aller dans la base de données chaque fois que vous changez de page.

Cependant, le tri peut devenir assez difficile.

Vous pouvez toujours utiliser un ObjectDataSource au lieu d'un SqlDatasource. Vous pouvez ensuite pointer votre ObjectDataSource pour regarder votre fonction DB.GetTrades(). Le tri et la pagination fonctionneront automatiquement.

J'espère que cela pourra aider.

29
Jamie

Vous pouvez créer une méthode pour lier la vue de la grille au lieu de la lier à nouveau dans la pagination. En créant une méthode qui lie la vue de grille, vous pouvez toujours appeler la méthode pour lier la vue de grille quand vous le souhaitez.

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(); 
   } 
}
2
Anil

J'ai dû rendre mon compteur _PageIndexChanging public (je suis tellement nouveau sur asp.net que je n'ai aucune idée de pourquoi c'est important). La page afficherait une erreur indiquant qu'elle ne pouvait pas trouver la classe. Ces messages ont été d'une grande aide pour faire fonctionner la pagination avec une logique verbatim autrement proche. Merci à toutes les affiches d'avoir pris le temps de le présenter si clairement. Voici le code avec lequel je me suis retrouvé:

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();

    } 
}

Je suis resté avec des colonnes générées automatiquement, et je fais une liaison de ligne à mes données sur la page cs que je n'ai pas incluse ci-dessus, mais voici mon code asp pour GridView:

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:GridView ID="GridView1" 
    OnRowDataBound="GridView1_RowDataBound" 
    OnPageIndexChanging="GridView1_PageIndexChanging"
    runat="server" 
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="true" 
    <-- table formatting code trimmed -->
</asp:GridView>

J'espère que quelqu'un d'autre pourra utiliser ces informations, ce fil était un excellent exemple simple à suivre. Maintenant que la pagination fonctionne, il est temps de devenir vraiment sophistiqué et de trouver un nouveau nom pour GridView1: D

1
brendan62269