如何使用ObjectDataSource用列表填充ListView

如何使用ObjectDataSource用列表填充ListView,listview,objectdatasource,Listview,Objectdatasource,我错过了什么 我对每个ProductCrash ProductCrash in _Fivellastest的看法是错误的,但我看不到任何替代方案。我不想离开foreach,让ListView为我发挥它的魔力。。有人知道怎么做吗?这对我真的很有帮助 我只能在列表视图中显示列表中的一个对象。我正在使用ObjectDataSource将我的列表与ListView绑定,不想更改它 在我的ascx.cs文件中,我检索列表_fiveLastest,带有实体 private List<Produ

我错过了什么

我对每个ProductCrash ProductCrash in _Fivellastest的看法是错误的,但我看不到任何替代方案。我不想离开foreach,让ListView为我发挥它的魔力。。有人知道怎么做吗?这对我真的很有帮助

我只能在列表视图中显示列表中的一个对象。我正在使用ObjectDataSource将我的列表与ListView绑定,不想更改它

在我的ascx.cs文件中,我检索列表_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>

ItemDataBound事件对于绑定的每个项都触发一次,这意味着如果ObjectDataSource1有10个项,该事件将触发10次

您要做的是将TimeStampLabel设置为fiveLastest的所有值,循环的最后一个值不变


基本上,去掉foreach循环,并查看e.Item.DataItem属性。这是列表视图的行绑定到的数据项。

在页面加载中设置列表视图项的objectDatasource

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();
}
databound事件将为数据源中的每个对象激发 因此,要在数据绑定事件中显示每个对象的信息,请编写以下命令

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

我想我的ObjectDataSource1没有绑定任何项?我只会触发一次ItemDataBound事件。我想我想破解的是,在一个got中设置ListView,然后完全去掉ObjectDataSource1,并将网格绑定到最新的列表。Spyros发布的代码将在那时起作用。+1票赞成告诉我删除ObjectDataSource1,thx alot.thx。我只是用ListView绑定数据源。但是我无法在e.Item.DataItem中获取数据项。我糟糕的解决方法是使用索引ProductCrash ProductCrash=_Fivellastest[index],当然,这不是最优的。当你说你不能从e.Item.dataitem中获取数据项时,你的意思是你有一个异常或者你获取了一个空对象?我在我的电脑上写了同样的代码,它在ListView控件中没有使用ObjectDataSource和DataSourceID时工作得很好。你得到的错误是什么?你确定你拥有的e对象是正确的吗ListViewItemEventArgs的类型?是。受保护的无效ListView2_ItemDataBoundobject发件人,ListViewItemEventArgs e{如果e.Item.ItemType==ListViewItemType.DataItem{Label statusLabel=Labele.Item.FindControlTimesLabel;Label productIDLabel=Labele.Item.FindControlProductIDLabel;如果索引<\u fiveLastest.Count{//e.Item.DataItem;无法在此处重新冻结数据项ProductCrash ProductCrash=\u fiveLastest[索引];奇怪的:/