2009-06-03 10 views
8

GridViewを使用して、かなり多くの場所で同じオブジェクトにバインドされたかなり大きなasp.net Webサイトがあります。私はアイテムテンプレートを使って各行をカスタマイズしています。しかし、すべてのページで同じテンプレートを使用するには、コピーする必要があります&は、各ページにアイテムテンプレートを貼り付けます。明らかに、これは最善の解決策ではありません。これに加えて、いくつかの設定ファイルを変更することによって、GridViewで使用されるテンプレートを変更できるようにしたいと考えています。 オプションは、DataGridでユーザーコントロールを作成し、各ページで使用する必要なプロパティを公開することです。しかし、これは動的にテンプレートを変更できるという第2の要件を満たしていません。 基本的に私は、GridViewにテンプレートを使用し、これを動的に行うことができると言う方法を探しています。どんなアイデアも役に立つでしょう。私はそれを参照として、あなたが望むものを達成するためには、次の2つのオプションがありGridViewアイテムテンプレートを動的に変更する

+0

あなたは別のデザインテンプレートbecozを変更しますか? –

+0

はい、私は別のデザインテンプレートを持っていて、それらを動的に変更できるようにしたいと考えています – Albert

答えて

9

1)コードで動的に各Te​​mplateFieldをビルドし、いくつかの設定に基づいてこれらを切り替えます。
2.)カスタムグリッド用のユーザーコントロールを作成し、代わりに使用します。

私はあなたがレイアウトを動的に変更するあなたの能力を取り除くが、その前提に挑戦させてくれるので、UserControlを使いたくないとお知りになりました。

PlaceHolder Controlを使用して、ユーザーコントロールを好みに動的に切り替えるために、組み込みのASP.Net機能を利用することができます。

<asp:PlaceHolder ID="GridViewPlaceHolder" runat="server" /> 

カスタムグリッドはそうのように、実行時に動的にた.ascxファイルで宣言的に構築し、その後、所定の場所にロードすることができます。

GridViewPlaceHolder.Controls.Add(LoadControl("~/Controls/MyCustomControl.ascx")); 

さて、あなたは本当に、その後、あなたの人生を容易にしたい場合すべてのカスタムグリッドコントロールが継承する抽象基本クラスを作成できます。このようにして、コントロールはロードされたときに一般的に扱われます。

public abstract class CustomGridControl: System.Web.UI.UserControl 
{ 
    public abstract Object DataSource { get; set; } 
} 

シンプルなグリッドは、マークアップで定義することができます。今すぐ利用し、ページまたはコントロールを

public partial class SimpleGrid : CustomGridControl 
{ 
    public override object DataSource 
    { 
     get { return myGridView.DataSource; } 
     set { myGridView.DataSource = value; } 
    } 
} 

<asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:TemplateField HeaderText="Name"> 
      <ItemTemplate> 
       <asp:Label Text='<%#Eval("Name") %>' runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Age"> 
      <ItemTemplate> 
       <asp:Label Text='<%#Eval("Age") %>' runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

そして、そのコントロールの背後にあるあなたのコードは次のようになりますこれは基本クラスにキャストするだけで、一般的に使用することができます。以下は、あなたがこれを使う方法の簡単な例ですが、私はそれが明確にポイントを作っていると思います。

protected void Page_Load(object sender, EventArgs e) 
{ 
    var dataSource = new List<MyCustomClass> 
         { 
          new MyCustomClass{Name = "Josh", Age = 43}, 
        new MyCustomClass{Name = "Bob", Age = 14}, 
        new MyCustomClass{Name = "Ashley", Age = 32}, 
         }; 

    DynamicallyLoadUserControlGrid("~/GridViewTemplates/SimpleGrid.ascx", dataSource); 
} 

private void DynamicallyLoadUserControlGrid(String controlLocation, List<MyCustomClass> dataSource) 
{ 
    var ctrl = (CustomGridControl)LoadControl(controlLocation); 
    ctrl.DataSource = dataSource; 
    ctrl.DataBind(); 

    GridViewPlaceHolder.Controls.Add(ctrl); 
} 

あなたはそれを持っています。カスタムテンプレートコントロールは、コード内で手動で作成しようとすると厄介な頭痛がありません。 を完全にマニュアルの別の回答で投稿するつもりですが、一度確認すればこの方法が好ましいと思います。

+0

タンクを大丈夫、 –

5

申し訳ありませんが、ここでは手動でテンプレートフィールドの100%を構築しています。

動的テンプレート列を作成する最初の手順は、System.Web.UI.ITemplateインターフェイスを実装するクラスを作成することです。ここの簡単な例では、ラベルを使用します。

DataBindingをサポートするには、追加するコントロールを手動で処理する必要があります。テンプレートを作成したら、これを使用したいTemplateFieldのItemTemplateとして使用できます。

グリッドをバインドするカスタムビジネスオブジェクトのコレクションがあるとします。

public class MyCustomClass 
{ 
    public String Name { get; set; } 
    public Int32 Age { get; set; } 
} 

各列を手動でTemplateFieldとして構築し、コレクションをGridViewにバインドする必要があります。このクリーナーを作ってやるしやすくするために、私は、静的なヘルパークラスにTemplateFieldコレクションの建物のアップをカプセル化しています

public static class MyCustomTemplateCollection 
{ 
    public static DataControlFieldCollection GetTemplateCollection() 
    { 
     var col = new DataControlFieldCollection(); 

     var nameField = new TemplateField 
         { 
          HeaderText = "Name", 
          ItemTemplate = new MyCustomTemplate("Name") 
         }; 

     var ageField = new TemplateField 
         { 
          HeaderText = "Age", 
          ItemTemplate = new MyCustomTemplate("Age") 
         }; 

     col.Add(nameField); 
     col.Add(ageField); 

     return col; 
    } 
} 

の後ろにあなたのコードでこれを使用すると、次のようになります。

protected void Page_Load(object sender, EventArgs e) 
{ 
    var dataSource = new List<MyCustomClass> 
         { 
          new MyCustomClass{Name = "Josh", Age = 43}, 
        new MyCustomClass{Name = "Bob", Age = 14}, 
        new MyCustomClass{Name = "Ashley", Age = 32}, 
         }; 

    DynamicGrid(dataSource); 
} 

private void DynamicGrid(List<MyCustomClass> dataSource) 
{ 
    var col = MyCustomTemplateCollection.GetTemplateCollection(); 

    foreach (DataControlField field in col) 
    { 
     myGridView.Columns.Add(field); 
    } 

    myGridView.DataSource = dataSource; 
    myGridView.DataBind(); 
} 

これは、動的ユーザーコントロールの例と同じ出力を生成しますが、わかるように、はるかに面倒です。これはCSS属性や複数の種類のコントロールを含まない非常に単純な例でもあります。あなたはこれを行うことができますが、それは苦痛であり、あなたはすべて一緒にプログラミングをやめたいと思うかもしれません。ユーザーコントロールソリューションを利用して、より簡単に生活しましょう。

関連する問題