0

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

3 に答える 3

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;
于 2011-07-07T13:06:11.287 に答える
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 プロパティを使用せずにキーを取得する別の方法を見つけることを強くお勧めします。

于 2011-07-07T11:20:17.307 に答える
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();
于 2011-07-07T15:20:48.490 に答える