3

これまでに作成したのは1つだけなので、ユーザーコントロールは初めてです。今日、ユーザーコントロールは自己完結型であり、親コンテナーからの情報に依存しないことになっていることを読んでいます。その部分はわかりますが、理解に苦労しているのは、その原則に基づいてプログラムを設計する「正しい」方法です。

そのページにユーザーコントロールがあるページがあるC#でWebフォームを作成しています。ascx ファイルでユーザー コントロールを作成し、それを aspx ページにドラッグしました。ユーザー コントロールは、SQL ストアド プロシージャの結果を表示するための 2 つの日付ボックスとグリッドビューです。

このコントロールを再利用したいのですが、「依存しない」に違反せずに、現在の特定のページに対して実行したいストアドプロシージャをユーザーコントロールに「伝える」方法がわかりません親コンテナ」ルール。

ありがとう

4

6 に答える 6

6

親コンテナに依存しないことは、通信できないことを意味するわけではありません。親が設定するユーザーコントロールのプロパティを公開します。ただし、クラッシュしないようにデフォルト値を設定してください。

また、これが非常に特殊なコントロールである場合、親に依存することが悪い理由はありません。理想的ではないかもしれませんが、ユーザーコントロールを使用してコードを分離することになります。

于 2009-05-05T20:59:11.423 に答える
2

親との通信を許可しない場合、ユーザーコントロールの真の力を逃してしまいます。この場合、カプセル化を少しやりすぎているのではないかと思います。

さまざまなユーザーデータの単なるテーブルまたはグリッドビューであるユーザーコントロールがあると想定します。必然的に、ユーザーコントロールは、データをどこからでも取得するために、ユーザーの一意の識別子について知る必要があります。これにより、もちろん、親ページが設定できるパブリックプロパティを作成する必要があります。

また、ユーザーコントロール内のアクションが、親に対してアクションをトリガーする必要がある場合があることに注意してください。ここでイベントデリゲートが登場します。これらは非常に便利であり、私の意見では、ユーザーコントロールがさらに便利になります。

ユーザーコントロールと親が前後に話さないことについての全体的な考えを捨てるだけで、物事がはるかに簡単になります。

于 2009-05-05T21:23:50.757 に答える
2

コントロールは、データがどこから来たのかを知る必要はありません。ストアドプロシージャなどについて知る必要はありません。知る必要があるのは、表示する必要のあるデータだけです。私があなたのコントロール権を理解しているなら、それはいくつかの日付フィルターを備えたグリッドです。データを受信し、そのデータを表示して、日付でフィルタリングします。それは問題ありません。知っておく必要があるのは、表示する必要のあるデータと、親からのデフォルトの開始日と終了日だけです。

于 2009-05-05T21:00:22.450 に答える
0

誰もが指摘しているように、ユーザー コントロールには、その意図と動作を伝える標準的な方法が必要です。これは、コンテナーへの参照が必要であるという意味ではありません。つまり、実際にコンテナーが含まれているもの (MyPage.aspx) を把握しておく必要があります。

ユーザー コントロールを操作する際に欠かせないものは、イベントです。イベントとその使用方法を学びます。イベントは、行動を伝える優れた方法です。

あなたの例では、基準 (日付テキスト ボックス) を独自のユーザー コントロールに分割することがあります。DateTime条件 (フィールド)を含む、EventArgs を継承する新しいクラスを作成します。ユーザーが検索をクリックするEventHandler<YourEventArgs>と、カスタム で (タイプの)イベントを発生させますEventArgs。ページはイベントを処理し、データベースにクエリを実行してから、結果を 2 番目のユーザー コントロールのパブリック メソッドまたは内部メソッドに渡し、レコードを表示します。

ここで重要なのは、別のストアド プロシージャを呼び出す必要がある場合、条件コントロールを別のページで再利用できることです。挿入と更新のシナリオを考えてみてください。多くの場合、UI 要素は同じです。1 つのコントロールを作成し、2 つの異なる動作 (AddRecord.aspx および UpdateRecord.aspx) を持つ 2 つの異なるページで使用できます。また、レコードを表示するコントロールは非常に簡単に再利用できます。

大きな利点の 1 つは、ページとコントロールがかなり小さくなることです。各コントロール/ページは、実際には機能の小さなサブセットのみに関係しています。コードの負担が減り、保守が容易になります。

于 2009-05-06T04:40:27.370 に答える
0

実行したいストアドプロシージャをユーザーコントロールに「伝える」

イベント/デリゲートを探しているように聞こえます
コントロールにイベントを公開させ、親にハンドラーを追加させます (おそらくコンストラクターで、イベントを1つだけ追加するように強制したい場合)
または、コマンドを使用することもできます/戦略パターン - 親にメソッドをカプセル化し、カプセル化オブジェクトをそのコンストラクターのコントロールに送信します。

于 2009-05-06T04:43:41.980 に答える
0

このユーザー コントロール内に、ストアド プロシージャによって返されるデータセットにデータバインドするものがいくつかありますか?

これを処理する 1 つの方法を次に示します。ストアド プロシージャをユーザー コントロールに伝達しようとする代わりに、ユーザー コントロールがユーザー コントロールのパブリック プロパティに依存するデータセットを作成します。

実行時に、ユーザー コントロールの外部にあるコードは、適切なストアド プロシージャを実行し、ストアド プロシージャによって返された結果にユーザー コントロールのデータセット プロパティを設定します。

于 2009-05-05T20:57:45.157 に答える