2011-01-27 1 views
0

OK本当に別のダムQの時間です。コントロールのプロパティを維持する

私は、ViewStateで永続化する必要のあるいくつかのプロパティを持つコントロールを持っています。また、コントロールがページ上に複数回表示される場合、プロパティが上書きされないようにする必要があります。

は私が

ViewState[String.Format("{0}_{1}", "BaseKey", this.ClientID)] = ... 

...のような何かを書くことを考えた。しかしクライアントIDの値は、ページのライフサイクルの途中で変更されます。それは "MyControl1"のようなものから始まり、 "ctl001_MyControl1"になります。変更前に適用された値はすべて失われます。

代わりにUniqueIDを使用すると同じことが起こります。

私は明らかな何かが不足していることを知っています。私は私が取っているので、私は見ていない薬を責めるつもりですあまりにもダム。

- スチュアートは

答えて

2

それが本当である場合は、ユーザーコントロール内でこれをやっているように見え、あなたは一意にする必要はありません。ビューステートのキーでは、すべてのコントロールの各インスタンスが独自のビューステートを管理するので、必要なのは次のようなコントロールのキーです。

ViewState[@"somekey"] = ... 
+0

を参照してください。私は言った*私は何かが欠けていた! :-) –

1

Page_PreRenderではなく、Page_Loadの上でそれをやってみては?

+0

Hmm。しかし、コントロールを使用する開発者がこれらのプロパティのいずれかをページのマークアップに設定すると、私はそれらを失います。 –

+0

マークアップの値は、IDが変更される前に設定されているようです。 –

1

relativeという名前の値をコントロール自体の出力名に格納しないでください。一意の変更されない名前を付けて、すべてのバインディングルールがクライアント名ではなくその名前に合っていることを確認します。

編集:私が何を意味するかの小さな例として

MyControl ctrl1 = new MyControl(); 
ctrl1.ID = "MyControlA"; 
ctrl1.Text = "Some text"; 
ViewState[ctrl1.ID] = ctrl1.Text; 

MyControl ctrl2 = new MyControl(); 
ctrl2.ID = "MyControlB"; 
ctrl2.Text = "Some other text"; 
ViewState[ctrl2.ID] = ctrl2.Text; 
+0

しかし、私は使用したユニークな値を維持しなければならず、私はその値をユニークに保存するために使用する永続キーを作成する必要があります。 –

+0

@Stuart Hemming - 私は私がフォローしているかわかりません。この変数を 'Steve'とすると、常に' Steve'になります。それはViewStateに置かれ、決して変更されません。コードの後ろには、クライアントのIDとは何の関係もない独自の識別子があります。後ろにあるコードの中にidを動的に生成していても、IDを持っています。もしあなたが本当にそのidを使っていたら、クライアントID文字列を '_'で分割し、あなたのIDとして最終的なインデックスを使用することで、常にそのIDを破ることができます。 –

+0

私は明らかにここでは本当に暗いです。私はMyControl - MyControlAとMyControlBの2つのインスタンスがある場合、私はviewstateに保存する "スティーブ"と呼ばれるプロパティを持って、MyControlA.Steve(viewstateの "スティーブ"として持続)に書き込む試みではないMyControlB.Steveのために以前に保存された値を混乱させる(同じコードを使用してviewstateの "Steve"としても永続化される)?私がMyControlAとMyControlBのユニークなキーを作成する場合、私はその値をどこかに残す必要があるので、後でそれを得ることができます。私はしない? –

関連する問題