2010-01-19 5 views
1

J'ai un GridView qui est rempli à partir d'un LinqDataSource. Lorsque je mets à jour une ligne, le RowCommand se déclenche et la modification est conservée dans la base de données, mais la grille ne s'actualise pas. Je l'ai dans un UpdatePanel et appelez explicitement Update() dans le gestionnaire RowCommand, mais il n'y a pas de publication et la page se trouve juste là en mode d'édition. Une fois que je clique sur annuler, il retournera en affichage seul et la grille affichera la nouvelle valeur. Je soupçonne que quelque chose dans le câblage de GridView concernant la source de données est faux. Aucune exception ne mijote cependant. Une copie allégée du balisage est ci-dessous. Des idées?ASP.Net GridView - Mettre à jour la commande de ligne ne revient pas à l'affichage uniquement

<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional" 
    EnableViewState="true" ChildrenAsTriggers="true"> 
    <ContentTemplate> 
    <asp:LinqDataSource ID="YieldDataSource" runat="server" 
     ContextTypeName="myhDataContext" TableName="vw_drug_yields" 
     OnSelecting="YieldDataSource_Selecting" EnableUpdate="true" /> 
    <asp:GridView ID="YieldGridView" runat="server" Width="900px" 
     OnRowDataBound="editGrid_RowDataBound" 
     DataSourceID="YieldDataSource" EnableViewState="true" 
     OnRowCommand="YieldGridView_RowCommand"> 
    <Columns> 
     <asp:TemplateField HeaderText="Net Fill" ItemStyle-HorizontalAlign="Center"> 
      <ItemTemplate><%# DataBinder.Eval(Container.DataItem, "net_fill") %> 
      </ItemTemplate> 
      <EditItemTemplate><asp:TextBox ID="tbNetFill" runat="server" 
      Text='<%# DataBinder.Eval(Container.DataItem, "net_fill") %>' > 
      </asp:TextBox></EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="False" ItemStyle-Width="40px"> 
      <ItemTemplate> 
      <asp:ImageButton CommandName="Edit" ID="btnEdit" SkinID="btnEdit" 
      runat="server" ToolTip="Edit" CausesValidation="false"/> 
      </ItemTemplate> 
      <EditItemTemplate> 
      <asp:ImageButton CommandName="Update" ID="btnSubmit" SkinID="btnSubmit" 
      runat="server" ToolTip="Save" CausesValidation="true" 
      CommandArgument="<%# ((GridViewRow) Container).DataItemIndex %>" /> 
      <asp:ImageButton CommandName="Cancel" ID="btnCancel" SkinID="btnCancel" 
      runat="server" ToolTip="Cancel" CausesValidation="false"/> 
      </EditItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    </asp:GridView></ContentTemplate></asp:UpdatePanel> 

Le gestionnaire:

protected void YieldGridView_RowCommand(Object sender, 
     GridViewCommandEventArgs e) { 
    if (e.CommandName == "Update") { 
     try { 
      int index = Convert.ToInt32(e.CommandArgument); 

      GridViewRow gdrow = YieldGridView.Rows[index]; 

      // do some validation and handle update 

      db.SubmitChanges(); 

      YieldGridView.DataBind(); 
      uPanel.Update(); 
     } 
     catch (Exception ex) { 
      ShowError(this, "Error while updating yields", ex, true); 
     } 
    } 
+0

À quoi ressemblent vos événements YieldGridView_RowCommand et Databound? Avez-vous mal saisi votre onRowDataBound? Juste curieux pourquoi c'est editGrid_RowDataBound au lieu de YieldGridView_RowDataBound – Wil

+0

editGrid_RowDataBound est surchargé dans mon BasePage et fait un formatage générique. J'ai copié tout ce code depuis une autre page où cela fonctionne très bien. La seule chose qui est différente ici est que ma source de données est une vue, pas une table, mais ma mise à jour est contre la table. – cdonner

+0

Enlever cela ne fait pas de différence, btw. – cdonner

Répondre

3

Après avoir enlevé le UpdatePanel et en éteignant callbacks pour le GridView, je recevais l'erreur suivante en cliquant sur le bouton de mise à jour:

Impossible de trouver une ligne correspondant les clés données dans les valeurs d'origine stockées dans ViewState. Assurez-vous que le dictionnaire 'keys' contient des valeurs de clé unique correspondant à une ligne retournée à partir de l'opération précédente Select .

Le problème est qu'il n'existe pas de clé unique pour ces données, car elles sont assemblées dynamiquement à partir de différentes sources. Cela ne devrait pas être nécessaire, mais il semble que GridView avec LinqDataSource ne puisse pas fonctionner sans elle. En outre, je remplis la grille à partir d'une vue qui ne possède pas de clé primaire. La solution implique 3 changements:

  • invalidantes mises à jour pour le LinqDataSource
  • en changeant le nom de la commande de mise à jour à MyUpdate (de sorte que Linq ne cherche pas à fil auto il)
  • réglage du YieldGridView.EditIndex = -1 avant d'appeler Update sur le UpdatePanel

Merci pour votre aide.

0

Avant d'appeler Update(), appelez GridView.DataBind() pour rebind contre le contrôle LinqDataSource.

+0

Je viens d'ajouter le code-behind. C'est ce que je fais. – cdonner

+0

Odd puis ... essayez ceci, mettez un point d'arrêt sur l'appel de la méthode db.SubmitChanges(). Avant de passer dessus et de l'exécuter, vérifiez db.GetChangeSet() dans la fenêtre immédiate et vérifiez s'il existe des insertions, des mises à jour ou des suppressions. L'ensemble de changements est la façon de comprendre ce qui change. Voir si des mises à jour sont en file d'attente. –

+0

Je n'utilise pas le mécanisme de mise à jour de GridView, donc je m'en fous de savoir s'il y a des changements. Je reçois le rowindex dans ma méthode, tire les données dont j'ai besoin de la ligne, puis exécute la requête Linq pour mettre à jour la ligne. – cdonner

0

essayez ceci:

YieldGridView.DataBind(); 
//though this seems useless after call to DataBind, but lets just try :) 
YieldGridView.EditIndex = -1; 
uPanel.Update(); 
+0

Ha, c'était l'une des choses que j'ai essayé avant de poster ici - en vain. – cdonner

+0

Comme je l'ai dit, il n'y a pas de publication, donc peu importe ce que je fais, il ne rafraîchit pas. Mais le code s'exécute pleinement et il n'y a pas d'exceptions (que je peux voir). – cdonner

Questions connexes