2009-07-17 7 views
0

Ok, s'il vous plaît garder avec moi que je peux être un peu d'un canard en bois parfois ...radiomessagerie de grandes quantités de données dans un Gridview

J'ai un gridview en asp.net qui sera tirant beaucoup mille d'enregistrements. Tout cela va bien en dehors de l'aspect performance des choses. Je lie mon Gridview à un ensemble de données et cela annule chaque enregistrement dans la requête. Je veux changer ceci de sorte que la vue de grille retire seulement les dossiers qu'elle affiche actuellement et puis quand l'utilisateur se déplace à la page suivante elle passe et obtient le prochain mandrin de données etc.

Voici comment je lie normalement mon gridviews et gérer la pagination et le tri, ce qui fonctionne très bien pour moi avec de petites quantités de données, mais pas si bon pour de grandes quantités de données. J'utilise SubSonic comme DAL, ce qui est cool. Quelqu'un peut-il me diriger dans la bonne direction sur la meilleure façon de réaliser la radiomessagerie comme décrit ci-dessus?

Merci à l'avance ...

public SortDirection SortDir 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
     { 
      ViewState["sortDirection"] = SortDirection.Ascending; 
     } return (SortDirection)ViewState["sortDirection"]; 
    } 
    set 
    { 
     ViewState["sortDirection"] = value; 
    } 
} 

DataSet ds = new DataSet(); 
DataView dv = new DataView(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     BindGrid(); 
     GridView1.DataSource = dv; 
     GridView1.DataBind(); 
    } 
} 

private DataView BindGrid() 
{ 
    ds = new Query(AnthemWeb.DAL.Item.Schema).ExecuteDataSet(); 

    if (ViewState["sortExpr"] != null) 
    { 
     dv = new DataView(ds.Tables[0]); 
     dv.Sort = (string)ViewState["sortExpr"]; 
    } 
    else 
    { 
     dv = ds.Tables[0].DefaultView; 
    } 

    return dv; 
} 

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    GridView1.PageIndex = e.NewPageIndex; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    string stExp = e.SortExpression; 
    string stDir = string.Empty; 
    if (SortDir == SortDirection.Ascending) 
    { 
     SortDir = SortDirection.Descending; 
     stDir = "DESC"; 
    } 
    else 
    { 
     SortDir = SortDirection.Ascending; 
     stDir = "ASC"; 
    } 

    ViewState["sortExpr"] = e.SortExpression + " " + stDir; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int selectedRowIndex; 
    selectedRowIndex = GridView1.SelectedIndex; 
    GridViewRow row = GridView1.Rows[selectedRowIndex]; 
    string ID = row.Cells[0].Text; 

    Response.Redirect("customer-details.aspx?ID=" + ID, false); 
} 

Répondre

0

Quelle version d'ASP.NET utilisez-vous? Il y a un contrôle DataPager qui vient avec ListView dans .NET 3.5 Voir system.web.ui.webcontrols.datapager

SubSonic prend également en charge la pagination, vous devez appeler la méthode paginée en ligne dans la requête. Voir SubSonic Paging

+0

Merci beaucoup les gars pour les réponses. J'essaie d'utiliser la méthode paginée dans Subsonic, mais le problème que je suis maintenant est que les contrôles de pager sur le gridview n'apparaissent pas ?? Je crée une collection et lie le gridview à ceci. Je passe en. Paged (pageIndex, 6). Le allowpaging est défini sur le gridview et j'ai une méthode pour gérer l'événement GridView1_PageIndexChanging - BindPagedData (e.NewPageIndex, 6); Aucun contrôle pour se déplacer dans la pagination n'apparaît - il y a 120 enregistrements à tester. Est-ce que je vais à ce sujet dans le mauvais sens? Merci pour toute l'aide que vous pouvez nous apporter. – macou

1

La méthode Fill() de DbDataAdapter classe a une surcharge pratique à cet effet très:

public int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable) 

Dans cette surcharge, vous pouvez fournir le numéro d'enregistrement à commencer par et les enregistrements maximum à récupérer à partir de ce point de départ. Cela vous permet de récupérer uniquement un sous-ensemble d'enregistrements de la source de données en fonction de l'index de page en cours. Tout ce que vous devez garder en mémoire est l'index d'enregistrement actuel qui est affiché.

Vous devrez donc modifier votre DAL pour fournir cette surcharge. Je n'ai pas utilisé SubSonic donc je ne peux pas dire si cette fonctionnalité existe dedans.

0

Une chose que vous pouvez faire est de mettre en mémoire tampon les données du serveur Web et de diffuser vos pages de données dans le navigateur Web. Vous pouvez le faire en utilisant GridView Conttrol et en créant un thread d'arrière-plan qui tire les données de votre base de données pour remplir le tampon en utilisant SqlDataReader. Ensuite, le navigateur extrait les pages de données (200 lignes de la première page, page de secondes, etc.) du serveur Web en utilisant AJAX jusqu'à ce que toutes les lignes du tampon soient transmises au navigateur et stockées dans le tableau de chaînes JavaScript. Je trouve cette stratégie efficace et testée jusqu'à un maximum de 300 000 lignes avec 18 colonnes. Un avantage est que la pagination des données ne dépend pas de votre base de données. Vous pouvez même effectuer un tri sur le tampon (qui peut être un DataTable) au lieu de cliquer à nouveau sur la base de données.

To find out more, you can follow this link. Espérons que cela aide.