OrderedDictionary是只读的,不能修改
本文关键字:不能 修改 只读 OrderedDictionary | 更新日期: 2023-09-27 18:01:30
Q:
当我尝试以下代码时:
((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;
Brute强制解决方案是在保存到会话之前将值复制到新字典:
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属性的情况下找到另一种获取密钥的方法。
- 为什么只是只读
由于Session["Keys"]中的引用指向gv_courses.DataKeys[index].Values,因此代码给出只读错误。整个DataKeyArray DataKey都是只读的,而且每个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
现在代码将运行,因为会话中的OrderedDictionary不再是只读的:
((IOrderedDictionary)Session["KeysCourse"])[2] = objToUpdate.Note_title;
((IOrderedDictionary)Session["KeysCourse"])[3] = objToUpdate.Iscourse;
我达到了我想做的事情,感谢所有回复。。
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();