5

ツリービューがあり、各ツリーノードに異なるユーザーコントロールのセットのIDが含まれているとします。ユーザーがノードをクリックすると、これらのコントロールがページにロードされます。ASPページのライフサイクルを理解しているので、動的コントロールは初期化段階で追加する必要があり、ポストバックイベントは後で発生します。

したがって、コントロールを追加する必要があった後にツリービュークリックイベントが発生した場合、ユーザーのポストバックイベントに基づいてコントロールを動的に追加するにはどうすればよいですか?


編集:私はArronLSからの提案を試しました:

私が行ったことは、ノード値をセッション配列に追加し、それを使用してinitを実行し、プレースホルダーコントロールのコントロールにロードするフォーム要素を選択することでした。ツリービューのクリックイベントで、セッション配列のノードを更新し、プレースホルダーの古いフォーム要素をクリアして、新しいフォーム要素をコントロールに追加します。ページが再度読み込まれると、初期化時にノードが検出されるはずなので、ビューステートの問題は回避されます。

現在、これを完全にテストしていませんが、ビューステートで発生する可能性のある問題について説明している同様の投稿がもう1つあります。彼らは、Initコントロール内のコンテキストのRequest []部分(この場合はドロップボックス)をポーリングし、ポストバック機能の一部を手動で処理するソリューションを提案しています。

私の新しい質問は、Request配列を使用してツリービューで選択したノードにアクセスする方法です。

4

5 に答える 5

1

これはあなたの直接の質問に対する答えではないかもしれませんが、私は自分で答えを見つけたことがないので、これが私が使用した回避策です。

TreeViewを操作するときに私がいつも使用しているアプローチは、aspxページでコントロールを一度宣言してから、クリックイベントで、IDに基づいてデータをコントロールにバインドすることです。必要に応じて、最初に可視性をvisible = "false"に設定し、バインド時に変更できます。このアプローチは、説明している難問だけを回避するため、うまく機能します。

ツリービューをあきらめることに反対しない場合は、ネストされたリピーターアプローチもうまく機能します。

于 2010-03-04T00:14:29.823 に答える
0

Request.Form選択したノードのIDがフォーム値として渡されることを覚えておくと役立つ場合があります。この値は、Initイベント中であっても、コレクションから常にアクセスできます。キーはのようなものになりますctl00_Content1_TreeView1_SelectedNode。ただし、そのIDだけでは必要な値が得られない可能性があるため、PostBackの原因となったのが実際にTreeViewであることを確認するためにRequest.Form["__EVENTARGUMENT"]も使用する必要があります。Request.Form["__EVENTTARGET"]

おそらく、必要な情報をフォームコレクションから引き出すことができます。ブレークポイントを設定して値を調べるだけです。この種のコードは常にひどくハックな感じがしますが、この場合、Page_Init中にフォームで送信された値を使用して何かを行う必要がある場合、TreeViewコントロールのイベントが処理されるのを待つことはできません。.NETが強く型付けされたプロパティですべてをうまくパッケージ化するのを待つのではなく、フォームの値を確認することを恐れないでください。それまでには手遅れになります。

于 2012-02-22T18:27:16.850 に答える
0

initでコントロールをロードしない場合の結果は、ビューステートのプロパティに変更があった場合、それらがコントロールに永続化されないことです。たとえば、ページの最初のリクエストでinitで動的にコントロールを作成し、ポストバックでinitで再度作成し、initの後、viewstateのプロパティ値がコントロールに適用される場合です。

したがって、最初にツリービュークリックイベントでコントロールを作成した場合、作成されたばかりなので、コントロールに適用するためのビューステートがまだ蓄積されていないため、これで問題ないと思います。ただし、これによりコントロールがビューステートを保存しないかどうかはわかりません。あなたはそれを実験しなければならないでしょう。

最初のポストバックの後の後続のポストバックでは、累積されたviestateを適用するために、initでコントロールを作成する必要があります。そのため、最初はイベントをクリックしてから、後続のポストバックでinitにコントロールを再度作成します。知らなかった場合は、リクエストごとにコントロールを再作成する必要があります。

したがって、問題は、コントロールのビューステートがどれほど重要であるかということになります。

編集:これがビューステートにどのように影響するか以外に他の結果があるかどうかは完全にはわかりません。

于 2010-03-04T00:18:38.500 に答える
0

もう少しフィードバックを得たいと思って、別の考えを捨てるだけです...

ポストバックイベントを使用して、セッション配列で選択した値を定義し、ページを強制的にそれ自体にリダイレクトすることができます。次に、ユーザーに表示されるinitは、イベントハンドラーが起動した後に効果的に実行されます。

悪い考えのようですので、何か他のものを期待しています。

于 2010-03-19T21:43:50.063 に答える
0

私があなたを正しく理解しているなら、あなたはツリーノードごとに異なるコンテンツを表示したいです。左側にツリービューがあり、中央にコンテンツ領域があると想定しています。

UIの観点から、私は通常、個々のビューが必要なコンテンツを備えた個別のユーザーコントロールであるMultiViewを使用してこれを解決します。treenodeクリックイベントは、Nodevalueプロパティに含まれるMultiViewActiveIndexを変更するだけで(IDはDataItemに格納されます)、コンテンツ領域を切り替えるだけです。

一般に、ツリーノードが動的に生成された場合でも、たとえばデータから、定義する必要のある「ノードビュー」ユーザーコントロールの数は有限になります。

ノート。含まれているすべてのビューはページのライフサイクル中にロードされるため、MultiViewコントロールを使用するときは注意してください。したがって、Page_Loadなどに「重労働」を入れないでください。

于 2010-03-22T20:45:05.573 に答える