viewstateについて にて回答したことに対する補足というかメモ。
LoadPageStateFromPersistenceMedium は Pair オブジェクトを返す。
この Pair の First には ControlState が、Second には ViewState が格納されている。
そこから以下は最初だけちょっと違って、Pair と ArrayList が交互に格納されている。
おそらく画面の構造がそのまま反映されているんだろう。
で、この ArrayList への格納の仕方がちょっとひどい。
偶数番目にコントロールのインデックスが格納されており、+1した奇数番目に ViewState のデータが Pair オブジェクトとして格納されている。
そこは Dictionary か、それこそ Pair を要素にしておけばいいんじゃないの?って感じがする。
実際 ControlState の方は、キーがコントロールの ID で、値に ControlState を格納する Pair オブジェクトを持つ HybridDictionary になっている。
なので、目的のコントロールの ControlState は見つけやすい。
目的のコントロールの ViewState は本当に見つけにくく、ページの構成に大きく左右されるため、意味不明で保守しづらい危険なコードになる。
ちなみに、GridView が 2 つ、Button が 1 つ並んでいる aspx にて、二番目の GridView の ViewState を削除するためには下記のコードが必要だった。
こんなの絶対保守したくない
それ以前に、こんなトリッキーなことは普通やらないわな