Gridview Item已添加错误

时间:2013-07-29 14:08:16

标签: c# asp.net .net gridview dictionary

首先,我已经看到问了同样的问题并且相信我,我已经阅读了答案和评论,并试图理解。否则我不会发帖。

那么,问题就在于:

我有一个我希望更新的gridview。

ASP代码如下所示:

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

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

以下是代码(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);
}

我在同一个命名空间中有另一个页面,它具有完全相同的布局(具有相同的列名),这可能导致错误。

这是错误代码:

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'

堆栈跟踪:

[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

5 个答案:

答案 0 :(得分:5)

看起来非常干燥,这就是导致问题的原因:

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

您告诉网格视图将用户刚刚输入的值添加到名为volume的新值中,该值是重复的。

如果要更新值,请执行以下操作:

e.NewValues["volume"] = whateverValueYouWantHere;

注意:通常,您会对值执行某种类型的用户输入清理,例如对值进行HTML编码以降低跨站点脚本(XSS)攻击的风险。

答案 1 :(得分:1)

试试这个:

e.NewValues["volume"] = value;

答案 2 :(得分:1)

NewValues是一个字典,它只能包含唯一键。因此,在这种情况下,您将多次添加相同的密钥,这就是您收到此错误的原因。 Asp.net管理预定义列的键。在添加/更新不存在的列时,应使用NewValues.Add。

在您的情况下,下面的内容非常合理:

e.NewValues["volume"] = value;

答案 3 :(得分:0)

异常消息解释了这一切。 ASP.NET会自动填充并使用文本框的值作为卷。如果你必须做一些不同的ASP.NET,比如修改值,做一些类似的事情:

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

答案 4 :(得分:0)

您好看着您的代码,似乎您正在添加新的值和元素。

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

为system.collections.IDictionary对象添加一个带有键和值的元素(As .net说) 那么我们的旧元素和值发生了什么,这些元素和值已经存在于system.collections.IDictionary对象中了? 好吧,我们必须先删除它们以添加新的更新值,所以如果有帮助请尝试以下代码

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

然而 Karl Anderson 答案更准确。