OrderedDictionary доступен только для чтения и не может быть изменен - PullRequest
0 голосов
/ 07 июля 2011

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;

Ответы [ 3 ]

1 голос
/ 07 июля 2011
  • Почему только для чтения?

Код выдает ошибку только для чтения, поскольку ссылка в сеансе ["Ключи"] указывает на gv_courses.DataKeys [index]. Значения, которые читаютсятолько.Весь DataKeyArray Datakeys доступен только для чтения, а также свойство Values ​​каждого его элемента DataKey.Из того, что я читал в Интернете, это выбор дизайна .net, и, вероятно, он предназначен только для чтения, поэтому он синхронизируется с источником данных (если вы можете изменить DataKeyArray, ему придется распространяться на источник данных).

  • Как установить мой ключ в сеансе, чтобы решить мою проблему?

Что вам нужно сделать, это сделать глубокую копию gv_courses.DataKeys [index] .Values, а затем сохранить эту новуюскопировать в сеансе ["ключи"].Например:

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;
1 голос
/ 07 июля 2011

Решение проблемы грубой силы заключается в копировании значений в новый словарь перед сохранением в сеансе:

IOrderedDictionary orderedDictionary = new OrderedDictionary();

foreach (KeyValuePair<TKey, TValue> kvp in gv_courses.DataKeys[index].Values)
{
    orderedDictionary.Add(kvp.key, kvp.value);
}

Session["Keys"] = keys;

Однако я настоятельно рекомендую найти другой способ получения ключей без использования свойства DataKeys вашего GridView.

0 голосов
/ 07 июля 2011

Я достигаю того, что хочу сделать, спасибо за все ответы ..

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