2009-02-28 9 views
1

基本的には、ドロップダウンリストと動的に追加されたユーザーコントロールがあります。ユーザーコントロールは、ドロップダウンリストで行われた選択に応じてグリッドビューを読み込みます。ドロップダウンリストはユーザーコントロールの一部ではありません。ViewState、UserControl、およびIsPostback

さて、問題は、どのようにシミュレートされません(isControlPostback = false)をユーザーがドロップダウンリストで選択を変更するたびに? ViewStateはコントロールを覚えているようです。

protected bool IsUserControlPostBack 
{ 
    get 
    { 
     return this.ViewState["IsUserControlPostBack"] != null; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsUserControlPostBack) 
    { 
     ViewState.Add("IsUserControlPostBack", true); 
     //load stuff in the grid view and bind it 
    } 
} 

ユーザーがドロップダウンリストの選択を変更し、私はjavascriptの確認ボックスを持って、そしてバックページの記事:私のユーザーコントロール内

私が持っています。したがって、ドロップダウンリストのOnSelectedIndexChangedイベントはトリガされません。選択したインデックスが変更されるたびに、次のようなことをするために削除したい: ViewState.Remove( "IsUserControlPostBack");

+0

私は、コントロールのOnLoadイベントが、ページのOnLoadイベントの直後に実行され、他のページのドロップダウンリストイベントの直前に実行されることを発見しました。したがって、基本的には、Pageがドロップダウンリストによってトリガされた変更に反応する前に、ユーザコントロールをロードします。この動作は本質的に問題です。 – sarsnake

答えて

0

: 私は、ユーザーコントロール内のパブリックプロパティを実装することになったむしろのOnInitよりもリストのSelectedIndexChangedイベントをドロップダウンサーバー内のコントロールをロードします。これにより、明示的なViewstateの使用が不要になりました。

0

OnLoadの前のいつかページにコントロールを追加します。例えば。 OnInit。 OnInitとOnLoadの間、ビューステートが読み込まれ、ポストバックイベントが実行されます。

+0

がすでにOnInit内に追加されています – sarsnake

1

プレレンダリングイベントでコントロールに変更を加えることができます。このイベントが発生すると、他のすべてのアクションが行われます。 また、ユーザーコントロールで公開プロパティを設定したり、値の設定が適切に反応するように設定することができます。

1

ユーザーコントロールでアクセスするViewStateは、ページでアクセスするViewStateと同じではありません。あなたのページがあなたのユーザコントロールと通信する必要がある場合は、この目的のためにユーザコントロールにパブリックメソッドを追加することをお勧めします。

何らかの理由で、あなたがあなたのViewStateの アプローチに似 何かを好む、する場合は、Context.Itemsを試すことができます。 Context.Itemsは要求間に保存される ではないことに注意してください。答えを知って興味を持っている人のため

+0

ページにコントロールをロードするとき、私は何かをしています コントロールを制御します= Load( "controlname.ascx"); コントロールは公開メソッドにアクセスできますか? 問題は、私がコントロールをロードするたびにコントロールを更新したくないということですが、ドロップダウンリストの選択が変更されたときだけです。 – sarsnake

+0

ページのViewstateは、コントロールのViewstateと異なりますか?それが私にとってのニュースです。それを説明するMSDNリンクがありますか? Viewstateのポイントは、すべてを1か所に保持するのではないのですか?今は完全に混乱している。 – sarsnake

+0

viewstateデータはすべて、1つの大きなチャンクでシリアル化され、ページに格納されます。しかし、データはツリー内のブランチとして編成され、各コントロールは独自のブランチを取得します。それにもかかわらず、ViewStateはコントロール間で状態を共有するためのものではありません。 –