2

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

那么问题来了:

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

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>

这是对象数据源:

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

5 回答 5

5

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

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

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

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

e.NewValues["volume"] = whateverValueYouWantHere;

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

于 2013-07-29T14:12:35.557 回答
1

试试这个:

e.NewValues["volume"] = value;
于 2013-07-29T14:12:00.463 回答
1

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

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

e.NewValues["volume"] = value;
于 2013-07-29T14:18:30.680 回答
0

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

e.NewValues["volume"] = value.Trim();
于 2013-07-29T14:13:12.093 回答
0

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

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

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

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

不过卡尔安德森的回答更为准确。

于 2013-07-29T15:20:43.367 回答