【问题标题】:The OrderedDictionary is read only and cannot be modifiedOrderedDictionary 是只读的,不能修改
【发布时间】:2011-09-30 07:32:21
【问题描述】:

问:

当我尝试以下代码时:

 ((IOrderedDictionary)Session["keys"])[2] = objToUpdate.Note_title;
 ((IOrderedDictionary)Session["keys"])[3] = objToUpdate.Iscourse;

抛出异常:

OrderedDictionary 是只读的,并且 无法修改。


我的问题:

  • 为什么只读?
  • 如何在会话中设置我的密钥,解决我的问题?

编辑:

我通过这个填写IOrderedDictionary

IOrderedDictionary keys = gv_courses.DataKeys[index].Values;

Session["Keys"] = keys;

【问题讨论】:

  • 这在事件gv_courses_RowCommand..
  • 您在使用带有 ObjectDatasource 的 GridView 吗?
  • gv_courses 是什么类类型,它从哪里获取数据?
  • gv_coursesgridview 。数据源是datatable

标签: c# asp.net session collections ordereddictionary


【解决方案1】:
  • 为什么只是只读?

代码给出了只读错误,因为 Session["Keys"] 中的引用指向只读的 gv_courses.DataKeys[index].Values。整个 DataKeyArray Datakeys 和每个 DataKey 元素的 Values 属性都是只读的。根据我在互联网上阅读的内容,这是一个 .net 设计选择,它可能是只读的,因此它与数据源保持同步(如果您可以修改 DataKeyArray,它必须传播到数据源)。

  • 如何在会话中设置我的密钥,解决我的问题?

您需要做的是制作 gv_courses.DataKeys[index].Values 的深层副本,然后将新副本保存在 Session["keys"] 中。 例如:

IOrderedDictionary keys = gv_courses.DataKeys[index].Values;
var keysTemp = new OrderedDictionary();
foreach (DictionaryEntry de in keys)
{
    keysTemp.Add(de.Key, de.Value);
}

OrderedDictionary 键与 gv_courses.DataKeys[index].Values 相同,但不是只读的。所以现在你可以将它保存到会话中:

Session["KeysCourse"] = keysTemp; //keysTemp is equal to keys but is editable

现在代码将运行,因为 Session 中的 OrderedDictionary 不再是只读的:

((IOrderedDictionary)Session["KeysCourse"])[2] = objToUpdate.Note_title;
((IOrderedDictionary)Session["KeysCourse"])[3] = objToUpdate.Iscourse;

【讨论】:

  • 我的错,你需要做一个深拷贝但没有只读部分,序列化它也会保存只读状态
  • 欢迎您,我找到了另一种方法来制作密钥的非只读副本,请再次检查我的答案
【解决方案2】:

我达到了我想做的事情,感谢所有回复..

                IOrderedDictionary keys = gv_courses.DataKeys[index].Values;
                string[] keysTemp = new string[4];
                keysTemp[0] = keys[0].ToString();
                keysTemp[1] = keys[1].ToString();
                keysTemp[2] = keys[2].ToString();
                keysTemp[3] = keys[3].ToString();
                Session["KeysCourse"] = keysTemp;

然后

 ((string[])Session["KeysCourse"])[2] = objToUpdate.Note_title;
 ((string[])Session["KeysCourse"])[3] = objToUpdate.Iscourse.ToString();

【讨论】:

    【解决方案3】:

    蛮力解决方案是在保存到会话之前将值复制到新字典:

    IOrderedDictionary orderedDictionary = new OrderedDictionary();
    
    foreach (KeyValuePair<TKey, TValue> kvp in gv_courses.DataKeys[index].Values)
    {
        orderedDictionary.Add(kvp.key, kvp.value);
    }
    
    Session["Keys"] = keys;
    

    但是,我强烈建议您在不使用 GridView 的 DataKeys 属性的情况下找到另一种获取密钥的方法。

    【讨论】:

    • 不,我不想那样做,只是我想修改会话中的数据而不是keys 本身。因为我通过这个IOrderedDictionary keys = gv_courses.DataKeys[index].Values; 设置我的密钥
    • 之后应该可以在会话中修改数据了。
    • 你的意思是你想修改 Session["keys"] 而不是键?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多