19

概要

こんにちはすべて、
OK、カスタムコントロールを使った私の冒険にさらに進んでください...

要約すると、カスタムコントロールの3つの主要な「クラス」について学習しました。これが間違っている場合は、遠慮なく訂正してください。

  1. UserControls - UserControlから継承し、 ASCXファイルに含まれています。これらは実行できることにはかなり制限がありますが、デザイナーのサポートによってUIの共通性をすばやく簡単に得ることができます。
  2. カスタムコンポジットコントロール-これらは、 CreateChildControlsメソッド内のコントロールに既存のコントロールを追加するWebControlから継承するコントロールです。これは優れた柔軟性を提供しますが、追加のコーディングなしではデザイナーのサポートが不足します。DLLにコンパイルできるため、移植性は高くなります。
  3. カスタムレンダリングコントロール-カスタムコンポジットコントロールと同様に、これらはWebコントロールライブラリプロジェクトに追加されます。コントロールのレンダリングは、 Renderメソッドをオーバーライドすることにより、プログラマーによって完全に制御されます。

私の考え..

OK、カスタムコンポジットで遊んでいると、次のことがわかりました。

  • HTML出力をほとんど/まったく制御できないため、「デバッグ」が困難になります。
  • CreateChildControls(および後続のメソッド)は、どこでもControls.Add(myControl)で非常に忙しくなる可能性があります
  • レンダリングテーブル(レイアウト用であれコンテンツ用であれ)はかなり扱いにくいことがわかりました。

質問)..

ですから、私はこれに慣れていないので、上記の私のポイントのいくつかでかなりオフベースになる可能性があることを認めます。

  • コンポジットを使用していますか?
  • HTML出力を制御するための巧妙なトリックはありますか?
  • 「それで地獄へ」と言って、先に進んでカスタムレンダリングされたコントロールを作成しますか?

優れたコントロール開発が全体的な開発時間をどれだけ短縮できるかを知っているので、それは私が心の中で本当に固くなりたいと思っています。

ご回答をお待ちしております^_^

4

6 に答える 6

5

カスタムレンダリングされたコントロールを先に進めてください。ほとんどの場合、コンポジットはUserControlで簡単に実行および使用できますが、それを超えると、独自のレンダリング戦略に値するように、より細かい制御(意図しないしゃれ)が必要になります。

コンポジットに値するほど単純なコントロール(たとえば、javascript / dhtmlベースの日付ピッカーと組み合わせたテキストボックス)があるかもしれませんが、その1つの例を超えて、カスタムレンダリングされたコントロールが進むべき道のように見えます。

于 2008-08-20T07:53:32.230 に答える
3

カスタム レンダリングに使用する別の拡張メソッドを次に示します。

 public static void WriteControls
        (this HtmlTextWriter o, string format, params object[] args)
 { 
    const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
    var controls  = new Dictionary<string,Control>();

    for(int i =0; i < args.Length; ++i)
    { 
       var c = args[i] as Control; 
       if (c==null) continue;
       var guid = Guid.NewGuid().ToString();
       controls[guid] = c;
       args[i] = delimiter+guid+delimiter;
    }

    var _strings = string.Format(format, args)
                         .Split(new string[]{delimiter},
                                StringSplitOptions.None);
    foreach(var s in _strings)
    { 
       if (controls.ContainsKey(s)) 
           controls[s].RenderControl(o);
       else 
           o.Write(s);
    }
}

次に、RenderContents() メソッドでカスタム コンポジットをレンダリングするために、次のように記述します。

protected override void RenderContents(HtmlTextWriter o)
{ 
    o.WriteControls
         (@"<table>
               <tr>
                    <td>{0}</td>
                    <td>{1}</td>
               </tr>
             </table>"
            ,Text
            ,control1);
 }
于 2008-08-20T13:18:31.417 に答える
2

ロブ、あなたは正しいです。私が言及したアプローチは一種のハイブリッドです。ascx ファイルがあることの利点は、私が見たすべてのプロジェクトで、デザイナーが実際のマークアップを編集するのが最も快適であり、ascx を使用するとデザイナーと別々に作業できることです。後でコントロール自体の実際の CSS/マークアップ/デザインを変更する予定がない場合は、カスタム レンダリング コントロールを使用できます。私が言ったように、私のアプローチはより複雑なシナリオにのみ関連します (そして、これらはおそらくデザイナーが必要な場所です:))

于 2008-08-20T19:44:35.810 に答える
1

私はよく複合コントロールを使用します。RenderまたはRenderContentsをオーバーライドする代わりに、各コントロールにCssClassを割り当て、スタイルシートを使用するだけです。複数のControls.Addの場合、拡張メソッドを使用します。

//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
 { foreach(Control control in controls) coll.Add(control);
 }

すばやくダーティなレンダリングを行うには、次のようなものを使用します。

writer.Render(@"<table>
                   <tr><td>{0}</td></tr>
                   <tr>
                       <td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");

コントロールプロパティの初期化には、プロパティ初期化構文を使用します。

childControl = new Control {  ID="Foo"
                            , CssClass="class1"
                            , CausesValidation=true;
                           };
于 2008-08-20T07:56:49.007 に答える
1

カスタム複合コントロールを使用すると、大規模な Web アプリケーションがあり、多くの場所で大きなチャンクを再利用したい場合に役立ちます。次に、自分自身を繰り返すのではなく、開発中の子コントロールのみを追加します。私が最近取り組んだ大規模なプロジェクトでは、次のことを行いました。

  • すべての複合コントロールにはコンテナーがあります。コントロール内のすべてのラップとして使用されます。
  • すべての複合コントロールにはテンプレートがあります。テンプレートのマークアップのみを含む ascx ファイル (<%Control%> ディレクティブなし)。
  • コンテナー (それ自体がコントロール) は、テンプレートから初期化されます。
  • コンテナーは、テンプレート内の他のすべてのコントロールのプロパティを公開します。
  • 複合コントロールでは this.Controls.Add([the_container]) のみを使用します。

実際には、指定されたテンプレートを使用してコンテナーを初期化し、テンプレートにコントロールが見つからない場合に例外をスローする基本クラスが必要です。もちろん、これは小さなアプリケーションではやり過ぎになる可能性があります。コードやマークアップを再利用せず、単純なコントロールのみを記述したい場合は、ユーザー コントロールを使用することをお勧めします。

于 2008-08-20T10:27:56.663 に答える
0

この手法を利用して、設計時間を簡単にすることができる場合があります。

http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

基本的には、LoadControl メソッドを使用して実行時にユーザー コントロールのインスタンスを作成し、何らかの状態バッグを渡して、コントロール ツリーにアタッチします。したがって、複合コントロールは実際にはコントローラーのように機能し、.ascx ファイルはビューのようになります。

これにより、コントロール ツリー全体をインスタンス化し、C# でコントロールのスタイルを設定する手間が省けます。

于 2008-09-16T11:20:20.213 に答える