質問

私はユーザーコントロールを初めて使用しますが、これまでに作成したのは1つだけです。私は今日、ユーザーコントロールが自己完結型であり、親コンテナからの情報に依存しないことになっていることを読んでいます。私はその部分を手に入れましたが、理解に問題があるのは<!> quot; right <!> quot;です。その原則に基づいてプログラムを設計する方法。

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

このコントロールを再利用したいのですが、<!> quot; tell <!> quot;ユーザーが<!> quot;に違反することなく、特定のページで実行するストアドプロシージャを制御します;親コンテナに依存しない<!> quot;ルール。

ありがとう

役に立ちましたか?

解決

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

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

他のヒント

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

ユーザーコントロールの親との通信を許可しない場合、ユーザーコントロールの真の力を逃してしまいます。この場合、カプセル化が少し遠すぎるかもしれません。

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

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

ユーザーコントロールと親がやり取りしないことについての考えをすべて捨てるだけで、物事がはるかに簡単になります。

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

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

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

他のすべての人が指摘したように、ユーザーコントロールには、その意図と動作を伝える標準的な方法が必要です。これは、コンテナへの参照を持っている必要があるという意味ではなく、そのため実際に何が含まれているか(MyPage.aspx)を知っています。

ユーザーコントロールを操作する際に不可欠だと思ったのはイベントです。イベントとその使用方法を学びます。イベントは行動を伝える素晴らしい方法です。

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

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

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

  

<!> quot; tell <!> quot;ユーザーが実行するストアドプロシージャを制御します

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top