3

ユーザー コントロールの子であるコントロール (たとえば、DataGrid または ComboBox) があります。ViewState を介して状態を維持するのではなく、すべてのリクエストで DataBind したいのです。しかし、私は去る必要がありEnableViewState=trueます。これは、TrackViewState() が呼び出される前に DataBind を呼び出す必要があることを意味します。

私はすばらしいブログ投稿を読んで、TRULY Understanding ViewStateを読んで、私の質問に答えています4. Initializing child controls programmatically。ただし、この記事の解決策は理想的とは言えません。子コントロールを動的に作成し (私はできませんし、できません。既存のコードが多すぎます)、サード パーティの CodeExpressionBuilder を使用します (これがコード ビハインドにあることを望んでいます)。 OnPreInitを使用します(これは、「CONTROLを開発している場合、まったく役に立ちません」)。

その記事はかなり古い (2006 年頃) ので、ASP.NET の新しいバージョンで状況が修正され、より良い解決策が得られるようになることを期待していました。それで、コミュニティ、これを行う良い方法はありますか?

4

1 に答える 1

0

スコット、

ASP.NETWebフォームフレームワークがどのように機能するかについて誤解があると思います。だから最初にほんの少しの理論。

ASP.NET Webフォームページには、デザインファイルと分離コードファイルがあります。デザインファイルには、HTMLマークアップと、ユーザーまたはカスタムコントロールへの参照タグである「コントロール」があります。属性を持つすべての要素runat = "server"はサーバー制御です(つまり、IDによって背後のコードからアクセスできます)。

ブラウザでページを開くと、ASP.NETはデザインファイルを取得してこれらのコントロール参照を処理し、最終的に純粋なHTMLを生成します。

runat = "server"ViewStateは、HTMLの非表示変数であり、でマークされ、プロパティEnableViewStateがTrueに設定されているすべてのコントロールの内部状態を保持します。

が付いたDataGridがあるとしEnableViewState = Falseます。このグリッドにはサーバーコントロールを含む行があり、それらをViewStateにする必要があります。あなたはまだそれらを持っていてEnableViewState = TrueViewStateにいることができ、そしてあなたはまだこれらのサブコントロールのイベントにバインドすることができます。

したがって、DataGridがViewStateにない場合でも、その子はViewStateにあり、適切なイベントを処理できます。

ポストバックのたびにデータを表示する場合は、PageLoadイベントでDataGridを毎回初期化する必要があります。

ViewStateは制御の内部状態を保持するため、ViewStateに制御の一部のプロパティを設定したり、ViewStateに制御のプロパティを設定したりすることはできません。ただし、親コントロールがViewStateにない場合でも、子コントロール(プロパティではなく、サブエンティティです!)をViewStateに含めることができます。

これについてもっと具体的にしたい場合はお知らせください。あなたが深く入りたいのなら、コントロールの開発についてのNikhilKothariからの素晴らしい本があります。どこかで電子書籍として見たと思います。

于 2010-03-04T20:04:55.333 に答える