2010-06-03 71 views
2

我错过了什么?如何使用ObjectDataSource填充列表视图

我的线路“foreach (ProductCrash productCrash in _fiveLastest)”是错误的,但我看不到任何选择。我不会让赛车出局,让ListView 对我来说是神奇的 ..有没有人知道如何做到这一点?这真的会帮助我。

我只能显示其中一个对象来自我的ListView中的列表。我使用ObjectDataSource将我的列表与ListView绑定,并且不想改变它。

在我的ascx.cs fil我检索列表_fiveLastest与实体。

private List<ProductCrash> _fiveLastest; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     index = 0; 
     _dataAccess = new DataAccess(); 
     _fiveLastest = _dataAccess.TimeStampForCrashByIndex(); 
     _fiveLastest.Sort((x, y) => y.CrashTimeStamp.CompareTo(x.CrashTimeStamp)); 
    } 

    protected void ListView2_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListViewItemType.DataItem) 
     { 
      foreach (ProductCrash productCrash in _fiveLastest) 
      { 
       Label statusLabel = (Label)e.Item.FindControl("TimeStampLabel"); 
       Label productIDLabel = (Label)e.Item.FindControl("ProductIDLabel"); 

       if (index < _fiveLastest.Count) 
       { 
        productIDLabel.Text = productCrash.ProductName; 
        statusLabel.Text = DatetimeHelper.MyDateTimeFormat(productCrash.CrashTimeStamp); 
       } 
      } 
     } 
    } 

=========

这里是我的ListView,ItemTemplate中,LayoutTemplate模板和ObjectDataSource

<asp:ListView ID="ListView2" runat="server" DataSourceID="ObjectDataSource1"  onitemdatabound="ListView2_ItemDataBound"> 

<ItemTemplate> 
    <tr style="background-color: #FFFFFF;color: #000000;"> 
     <td style="padding: 5px 5px;"> 
      <asp:Label ID="ProductIDLabel" runat="server" /> 
     </td> 
     <td style="padding: 5px 5px;"> 
      <asp:Label ID="TimeStampLabel" runat="server" /> 
     </td> 
    </tr> 
</ItemTemplate> 

<LayoutTemplate> 
    <table runat="server"> 
     <tr runat="server"> 
      <td runat="server"> 
       <table ID="itemPlaceholderContainer" runat="server" border="1" 
        style=" background-color: #FFFFFF;border-color: #999999;border-style:solid;border-width:1px;font-family: Verdana, Arial, Helvetica, sans-serif;"> 
        <tr id="Tr1" runat="server" style="background-color: #DCDCDC;color: #333333; text-align:left; padding: 5px 10px;"> 
         <th runat="server" style="padding: 5px 5px; text-transform:uppercase;"> 
          Produkt</th> 
         <th runat="server" style="padding: 5px 5px; text-transform:uppercase;"> 
          Tidspunkt</th> 
        </tr> 
        <tr ID="itemPlaceholder" runat="server"> 
        </tr> 
       </table> 
      </td> 
     </tr> 

    </table> 
</LayoutTemplate> 

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
SelectMethod="CreateStateLog" TypeName="Website.StateLog" 
UpdateMethod="CreateStateLog"> 
<UpdateParameters> 
    <asp:Parameter Name="stateLogID" Type="Int32" /> 
    <asp:Parameter Name="productID" Type="Int32" /> 
    <asp:Parameter Name="status" Type="Int32" /> 
    <asp:Parameter Name="timeStamp" Type="DateTime" /> 
</UpdateParameters> 
<SelectParameters> 
    <asp:Parameter Name="stateLogID" Type="Int32" /> 
    <asp:Parameter Name="productID" Type="Int32" /> 
    <asp:Parameter Name="status" Type="Int32" /> 
    <asp:Parameter Name="timeStamp" Type="DateTime" /> 
</SelectParameters> 
</asp:ObjectDataSource> 

回答

3

设置在页面加载ListView项

protected void Page_Load(object sender, EventArgs e) 
{ 
    _fiveLastest = _dataAccess.TimeStampForCrashByIndex(); 
    _fiveLastest.Sort((x, y) => y.CrashTimeStamp.CompareTo(x.CrashTimeStamp)); 
    listViewControl.DataSource = _fiveLastest; 
    listViewControl.DataBind(); 
} 

数据绑定事件将在数据源 火每个对象的ObjectDataSource控件,以便为在数据绑定事件的每个对象显示的信息写这

protected void ListView2_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     Label statusLabel = (Label)e.Item.FindControl("TimeStampLabel"); 
     Label productIDLabel = (Label)e.Item.FindControl("ProductIDLabel"); 
     //get the current ProductCrash object 
     var productCrash = (ProductCrash)e.Item.DataItem; 
     productIDLabel.Text = productCrash.ProductName; 
     statusLabel.Text = productCrash.CrashTimeStamp; 
    } 
} 
+0

Thx。我只是将数据源与我的ListView绑定。 虽然我无法获取e.Item.DataItem中的“DataItem”。 我的不好的解决方法是使用索引 ProductCrash productCrash = _fiveLastest [index]; ,但当然这不是最优的。 – radbyx 2010-06-03 14:39:39

+0

当你说你不能从e.Item.DataItem中获取数据项时,你的意思是说你有一个异常或者你接受一个空对象? – Spyros 2010-06-03 16:26:31

+0

我在我的电脑上写了相同的代码,它完美的工作,而不使用ListView控件中的ObjectDataSource和DataSourceID什么是你得到的错误? – Spyros 2010-06-03 16:36:29

2

的codesnippet ItemDataBound事件是为每一个项目是一次烧成这意味着如果你的ObjectDataSource1有10个项目,事件将激发10次。

你要做的是将TimeStampLabel设置为fiveLastest的所有值,以及循环的最后一个值。

基本上,摆脱foreach循环,并看看e.Item.DataItem属性。这是列表视图的行所绑定的DataItem。

+0

我不认为我的ObjectDataSource1有任何项目绑定到它?我只会让ItemDataBound事件被触发一次。 我想什么即时尝试破解是,一次去设置ListView – radbyx 2010-06-03 13:41:20

+0

然后摆脱ObjectDataSource1完全,并将网格绑定到_fiveLastest列表。 Spyros发布的代码将会工作。 – SWeko 2010-06-03 13:44:57

+0

+1投票告诉我摆脱ObjectDataSource1,thx很多。 – radbyx 2010-06-03 14:35:58