2012-03-09 35 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。

回答

1

随着composite databound control,你可以得到这样的事情:

<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> 

的实现可能是一个有点棘手,如果你之前没有做到这一点,大多数的例子是列表(数据源时是对象列表)。您需要重写CreateChildControls方法并实例化正确的模板(使用项目的类型)。

DetailsView和FormView是众所周知的控件,旨在显示单个项目和调用特定的模板。但是这两个控件都用作DataSource的IEnumerable对象,所以基本上你不能像FormView.DataSource = car; FormView.DataBind()那样打电话,因为汽车没有实现IEnumerable。所以拥有IEnumerable数据源有点重要。

你可以做什么是覆盖DataSource属性

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

和标记将

<asp:ListView runat="server"> 
     <ItemTemplate> 
      <uc:CVehicleView runat="server" VehicleDataSource='<%# Container.DataItem %>'> 
... 
相关问题