2012-03-09 16 views
1

私はVehicleという基本クラスを持っています。私は車、Suv、トラックなどと呼ばれるクラスを派生しました。リストビューで個々の子クラスを別々にレンダリングする最も良い方法は何ですか?

私ができる必要があるのは、リストビューにそれらをバインドすることです。

ListView.DataSource = List<Vehicle>; 
ListView.DataBind(); 

List<Vehicle>は車のミックスすることができ、トラックなど

aspxページで、私は彼らのvehicletypeプロパティに応じてそれらを表示できるようにしたいです。

<uc:VehicleView ID="VehicleView" runat="server" VehicleItem='<%#DataBinder.GetDataItem(Container) as Vehicle %>' /> 

このユーザーコントロールは、データバインド時にコードの背後に正しいオブジェクトを持ちます。これらはすべてこれまでのところ動作します。

リストのページには、車両クラスの共通のプロパティのみが記載されていますが、車種ごとに異なる物やレイアウトを表示する必要があります。

私の質問は、この単一の車両ビューコントロールに異なるデータを表示する最もよい方法です。他のパネルを切り替えて、コード、その他のオプションで異なるユーザーコントロールを読み込みますか?私はaspxのhtmlを維持したいと思います。あなたが前にそれをしなかったと例のほとんどがリストにある場合、実装はデータソースがあるときのために(少しトリッキーかもしれません

<asp:ListView runat="server"> 
    <ItemTemplate> 
     <uc:CVehicleView runat="server" DataSource='<%# Container.DataItem %>'> 
      <Car> 
        html for car goes here <%# Eval("SpecificCarProperty") %> 
      </Car> 
      <Suv> 
        html for suv goes here <%# Eval("SpecificSuvProperty") %> 
      </Suv> 
     </uc:CVehicleView> 
    </ItemTemplate> 
</asp:ListView> 

composite databound control

答えて

1

あなたはこのような何かを得ることができますオブジェクトのリスト)。 CreateChildControlsメソッドをオーバーライドして、適切なテンプレートをインスタンス化する必要があります(アイテムのタイプを使用)。

DetailsViewとFormViewは、単一のアイテムを表示して特定のテンプレートを呼び出すように設計されたよく知られたコントロールです。しかし、両方のコントロールはIEnumerableオブジェクトをDataSourceとして使用します。したがって、IEnumerableを実装していないため、基本的にFormView.DataSource = car; FormView.DataBind()のような呼び出しを行うことはできません。したがって、IEnumerableデータソースを持つことは少し重要です。

何ができることは

public class CVehicleView : CompositeDataBoundControl 
{ 
    private object dataSource; 
    public override object DataSource 
    { 
     get { return new List<object> { dataSource }; } 
     set { dataSource = value; } 
    } 
} 

DataSourceプロパティをオーバーライドすることで、マークアップが

<asp:ListView runat="server"> 
     <ItemTemplate> 
      <uc:CVehicleView runat="server" VehicleDataSource='<%# Container.DataItem %>'> 
... 
だろう
関連する問題