2010-06-03 2 views
2

무엇이 내가 쓴 것을 찾을 수 있나요?ObjectDataSource를 사용하여 ListView를 목록으로 채우는 방법

내 전화 번호 "foreach (ProductCrash productCrash in _fiveLastest)"은 잘못되었지만 어떤 대안도 표시되지 않습니다. 나는 foreach 밖으로 타는 것을 얻지 않을 것이고 ListView가 ...을 위해 그것의 마술을 행하는 을한다. 이것을하는 방법을 아는가? 그것은 정말로 나를 도와 줄 것입니다.

하나의 개체 만 내 ListView에 표시 할 수 있습니다. ObjectDataSource를 사용하여 ListView와 내 목록을 바인딩하고이를 변경하지 않으려합니다.

내 ascx.cs fil에서 Entity를 사용하여 _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); 
       } 
      } 
     } 
    } 

는하여 ItemDataBound 이벤트는 모든 항목에 대해 한 번 해고 내 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

데이터 바인딩 이벤트가 데이터 소스 에있는 모든 개체에 대해 발생합니다

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 DataSource 바인딩합니다. e.Item.DataItem에서 "DataItem"을 가져올 수 없습니다. 좋은 해결책은 인덱스를 사용하는 것입니다. ProductCrash productCrash = _fiveLastest [index]; 하지만 물론 적당하지 않습니다. – radbyx

+0

e.Item.DataItem에서 데이터 항목을 가져올 수 없다는 말은 예외가 있거나 null 객체를 사용한다는 의미입니까? – Spyros

+0

내 컴퓨터에 동일한 코드를 작성했는데 ListView 컨트롤에서 ObjectDataSource 및 DataSourceID를 사용하지 않으면 완벽하게 작동했습니다. 오류는 무엇입니까? – Spyros

2

의 codesnippet입니다 bound, 즉 ObjectDataSource1에 10 개의 항목이 있으면 이벤트가 10 번 실행됩니다.

여러분이하는 일은, TimeStampLabel을 fiveLastest의 모든 값으로 설정하고 루프의 마지막 값이 막대기입니다.

기본적으로 foreach 루프를 없애고 e.Item.DataItem 속성을 살펴보십시오. 목록보기의 행이 바인딩 된 DataItem입니다.

+0

내 ObjectDataSource1에 바인딩 된 항목이 없다고 생각합니까? 한 번 해고 만 ItemDataBound 이벤트를 가져옵니다. 내가 해킹하려고하는 것은 ListView를 한 번에 설정하는 것입니다. – radbyx

+0

다음 ObjectDataSource1을 모두 제거하고 _fiveLastest 목록에 표를 바인딩하십시오. Spyros가 게시 한 코드가 작동합니다. – SWeko

+0

ObjectDataSource1, thx alot를 없애라는 +1 투표. – radbyx