【问题标题】:Gridview Item has already been added errorGridview 项目已添加错误
【发布时间】:2013-07-29 08:57:12
【问题描述】:

首先,我看到有人提出了类似的问题,相信我,我已经阅读了答案和 cmets 并试图理解。否则我不会发帖。

那么问题来了:

我有一个想要更新的网格视图。

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

【问题讨论】:

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


    【解决方案1】:

    看起来很干脆,这是导致问题的原因:

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

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

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

    e.NewValues["volume"] = whateverValueYouWantHere;
    

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

    【讨论】:

    • 谢谢!有效。答案这么简单,我觉得有点愚蠢^^
    【解决方案2】:

    试试这个:

    e.NewValues["volume"] = value;
    

    【讨论】:

      【解决方案3】:

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

      在您的情况下,以下将完全正常:

      e.NewValues["volume"] = value;
      

      【讨论】:

        【解决方案4】:

        异常消息说明了一切。 ASP.NET 自动填充并使用 textbox 的值作为卷。如果您必须做一些与 ASP.NET 不同的事情,例如修剪值,请执行以下操作:

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          不过卡尔·安德森的答案更准确。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-25
            • 2017-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多