2009-02-24 5 views
4

J'ai un gridview dont la propriété DataSourceID est définie sur un objet ObjectDataSource personnalisé. Lorsque AllowPaging a la valeur True, GridView disparaît après une publication. Si j'ai défini AllowPaging sur False, ça va. Quelqu'un peut-il éclairer cela pour moi? :)Gridview disparaît à la publication lorsque la pagination est activée

Edit: L'autre chose que je suis confus au sujet est que je pensais que si vous définissez la DataSourceID que la grille obtiendrait des données de la source de données chaque fois qu'il en avait besoin. Si la grille disparaît parce qu'elle ne contient pas les données, pourquoi la grille n'a-t-elle pas les données dont elle a besoin à partir de la source de données?

Répondre

4

Il est possible qu'après la publication, la source de données ne soit pas conservée ou rechargée et qu'il n'y ait aucun élément à remplir dans la grille. Êtes-vous en train de gérer l'état correctement pour l'objet source de données (reliant/conservant la source en vie) lorsque la pagination est activée? Cela peut sembler une réponse vague, mais sans un exemple de la façon dont la source reçoit les données, il est difficile de diagnostiquer pourquoi les éléments auraient disparu.

Éditer:
La méthode à laquelle je pensais concernait la fonction de pagination/tri de rappel. Cependant, j'ai trouvé quelques informations qu'il & ODS en Ontario Paging .. assurez-vous que vous avez défini les éléments suivants:

  1. GridView: AllowPaging et bien sûr vous devez définir PageSize.
  2. ObjectDataSource: EnablePaging, vous devez également régler:
    • MaximumRowsParameterName = "maxRows"
    • StartRowIndexParameterName = "startRowIndex"
    • SelectCountMethod = "RecordCount"

I pense que vous avez seulement besoin de définir les 3 sous-items de l'item 2 si vous voulez gérer manuellement la taille de la pagination.

Ensuite, vous pouvez lire plus sur ce here.

+0

Lorsque AllowPaging est False Je pensais que la grille ne se reconnectait pas, elle récupérait simplement les valeurs de viewstate. Êtes-vous en train de dire que je dois lier les données au gridview sur chaque publication lorsque la pagination est activée même si je ne vais pas sur une autre page? Je suis juste en cliquant sur un bouton sur la page. – adam0101

+0

Je pense qu'il existe un moyen de faire en sorte que la grille gère la pagination par elle-même si elle est liée à une source de données via un ID mais qu'il y a une propriété que vous devez définir, même si je pense au pagination de rappel. Laissez-moi vérifier. Sinon oui vous devez généralement gérer manuellement la pagination. –

+0

Après avoir lu ceci: http://blog.tylerholmes.com/2008/06/datasource-vs-datasourceid-internals.html, il semblait que le simple paramétrage de DataSourceID était le déclencheur pour obtenir la grille de données elle-même chaque fois qu'il avait besoin de données. – adam0101

0

Pour répondre à plus de la réponse @ adam0101, ce je pense qu'il entend par » ... Il se ma source de données personnalisée revenait zéro pour le nombre d'enregistrements. « Est que vous devrez peut-être » rattachez "la source de données à la grille. ASP.net sait automatiquement que vous revenez enregistrement-'n ', où' n 'est la première ligne suivante de la page suivante. Cette solution est plus pour les cas où vous ne voulez pas autoriser asp.net gérer automatiquement les données dans votre grille, peut-être en raison de vouloir charger des données après un autre événement (un bouton LOAD DATA par exemple), et non lorsque le la page a été chargée pour la première fois. Mais, comme Adam l'a mentionné ci-dessous, la véritable raison était qu'il "... avait créé une sous-classe de source de données qui avait hérité de ObjectDataSource, mais qu'elle avait été implémentée de manière incorrecte.". Désolé pour ma supposition là Adam. Merci

Cependant, le reste de ma solution fonctionnera pour ceux qui sont bloqués sur l'utilisation de sources de données dérivées manuellement.

-à-dire

Définissez votre GridView comme ci-dessus, et la note - sans propriété DataSource! Voici mon exemple:

 <asp:GridView ID="gvStudents" DataKeyNames="StudentID" runat="server" 
      ShowFooter="True" AutoGenerateColumns="False" Width="100%" AllowSorting="True" AllowPaging="true" PageSize="10" OnPageIndexChanging="gvStudents_PageIndexChanging"> 

Suivant faire une méthode privée ou de routine que vous pouvez faire appel à chaque fois que vous devez forcer le gridview sur une nouvelle page.

private void BindGridViewServer(GridView gv1) 
{ 
    gv1.DataSource = sdsStudents; //re-attach the datasource 
    gv1.DataBind();     //get a page of data AllowPaging must be true 
} 

Ensuite, créez la méthode OnPageIndexChanging:

protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    GridView myGV = (GridView)sender; 
    myGV.PageIndex = e.NewPageIndex; 
    BindGridViewServer(myGV); 
} 

Par souci de compléter cette réponse, voici mon code où je charge les données quand je veux - pas quand un PostPack est tiré, qui est la valeur par défaut ...

protected void btnSEARCH(object sender, EventArgs e) 
     { 
//some code 
        //bind the gridview to the datasource here and then bind! 
        gvStudents.DataSource = sdsStudents; 
        gvStudents.DataBind(); 
//more code etc 
     } 
+1

En fait, ce n'est pas vrai. Ce que je voulais dire par ma réponse, c'est que j'avais créé une sous-classe de datasource qui héritait de ObjectDataSource, mais elle a été implémentée de manière incorrecte, de sorte que le nombre d'enregistrements renvoyait littéralement zéro. Le reste de votre réponse pourrait être vrai, je ne sais pas - heureusement, je n'ai pas eu à travailler avec WebForms pendant des années, mais c'était la signification réelle de mon commentaire. – adam0101

+0

Bravo à toi Adam. Merci. J'ai mis à jour ma réponse. – Fandango68