OrderedDictionary是只读的,不能修改

时间:2011-07-07 09:35:31

标签: c# asp.net session collections ordereddictionary

问:

当我尝试以下代码时:

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

3 个答案:

答案 0 :(得分:1)

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

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属性的情况下找到另一种获取密钥的方法。

答案 1 :(得分: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 :(得分:0)

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

                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();