2013-07-29 6 views
2

Tout d'abord, j'ai vu que des questions simliar ont été posées et croyez-moi, j'ai lu les réponses et les commentaires et j'ai essayé de comprendre. Sinon je ne posterais pas.Gridview L'article a déjà été ajouté erreur

Ainsi, la question alors:

J'ai un gridview que je souhaite mettre à jour.

Le code ASP ressemble à ceci:

<asp:GridView ID="myGv" runat="server" 
    AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" 
    AutoGenerateColumns="False" AllowPaging="true" AllowSorting="true" DataKeyNames="id" DataSourceID="myObjectDataSource" 
    OnRowUpdating="myGv_RowUpdating" > 
    <Columns> 
     <asp:BoundField DataField="id" HeaderText="id" Visible="false" InsertVisible="False" ReadOnly="True" SortExpression="id" /> 
     <asp:BoundField DataField="type" HeaderText="type" SortExpression="type" ReadOnly="True" /> 
     <asp:BoundField DataField="date" HeaderText="date" SortExpression="date" ReadOnly="True" /> 
     <asp:BoundField DataField="volume" HeaderText="volume" SortExpression="volume" /> 
    </Columns> 
</asp:GridView> 

C'est le ObjectDataSource:

<asp:ObjectDataSource ID="myObjectDataSource" runat="server" 
    DeleteMethod="myDeleteMethod" SelectMethod="mySelectMethod" 
    TypeName="url.sqlDataLayer" UpdateMethod="myUpdateMethod"> 
    <DeleteParameters> 
     <asp:Parameter Name="id" Type="Int32" /> 
    </DeleteParameters> 
    <SelectParameters> 
     <asp:Parameter Name="fromDate" Type="DateTime" /> 
     <asp:Parameter Name="toDate" Type="DateTime" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="id" Type="Int32" /> 
     <asp:Parameter Name="volume" Type="Int32" /> 
    </UpdateParameters> 
</asp:ObjectDataSource> 

Et voici le code derrière (C#):

protected void myGv_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridViewRow row = (GridViewRow)myGv.Rows[e.RowIndex]; 

    string value = ((TextBox)(row.Cells[3].Controls[0])).Text; 

    e.NewValues.Add("volume", value); 
} 

J'ai cette autre page dans le même espace de noms qui a exactement la même mise en page (avec les mêmes noms de colonnes) qui est probablement à l'origine de l'erreur.

C'est le code d'erreur:

Item has already been added. Key in dictionary: 'volume' Key being added: 'volume' 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: Item has already been added. Key in dictionary: 'volume' Key being added: 'volume' 

Et la trace de la pile:

[ArgumentException: Item has already been added. Key in dictionary: 'volume' Key being added: 'volume'] 
    System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) +14349425 
    System.Collections.Specialized.OrderedDictionary.Add(Object key, Object value) +144 
    namespace.class.myGv_RowUpdating(Object sender, GridViewUpdateEventArgs e) in theurl.aspx.cs:55 
    System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1157 
    System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +762 
    System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +164 
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +84 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3804 

Répondre

5

semble assez coupé et sec, c'est la ligne qui cause le est poursuivre:

e.NewValues.Add("volume", value); 

Vous dites la vue de la grille d'ajouter la juste valeur saisie par l'utilisateur dans une nouvelle valeur appelée volume, qui est un doublon.

Si vous souhaitez mettre à jour la valeur, faites ceci:

e.NewValues["volume"] = whateverValueYouWantHere; 

Note: En règle générale, vous faire un certain type d'entrée utilisateur nettoyage sur la valeur, comme HTML encode la valeur pour réduire la risque d'attaques par script intersite (XSS).

+0

Merci! Ça a marché. Je me sens un peu bête que la réponse soit si simple ^^ –

1

Essayez ceci:

e.NewValues["volume"] = value; 
0

Le message d'exception explique tout. ASP.NET remplit automatiquement et utilise la valeur de zone de texte pour le volume. si vous avez à faire quelque chose de différent ASP.NET ne, par exemple couper la valeur, faire quelque chose comme:

e.NewValues["volume"] = value.Trim(); 
1

NewValues est un dictionnaire et il peut contenir des clés uniques seulement. Dans ce cas, vous ajoutez plusieurs fois la même clé, c'est pourquoi vous obtenez cette erreur. Asp.net gère les clés pour les colonnes prédéfinies. Vous devez utiliser NewValues.Add lorsque vous ajoutez ou mettez à jour une colonne non existante.

Dans votre cas ci-dessous fonctionnera parfaitement:

e.NewValues["volume"] = value; 
0

Salut regardant vous codez il semble que vous ajoutez de nouvelles valeurs et des éléments.

e.NewValues.Add("volume", value); 

ajoute un élément avec la clé fournie et la valeur à l'objet system.collections.IDictionary (comme .net dit) Qu'est-il arrivé à nos anciens éléments et les valeurs qui sont déjà présentes dans l'objet system.collections.IDictionary ?? Eh bien, nous devons les supprimer d'abord d'ajouter une nouvelle valeur mise à jour si le code ci-dessous s'il vous plaît essayer si elle aide

e.OldValues.Remove("volume", Value); 
e.NewValues.Add("volume", value); 

Cependant Karl Anderson réponse est plus précise.

Questions connexes