【问题标题】:How to fill a ListView with a list using ObjectDataSource如何使用 ObjectDataSource 用列表填充 ListView
【发布时间】:2010-06-03 13:17:51
【问题描述】:

我错过了什么?

我的“foreach (ProductCrash productCrash in _fiveLastest)”行是错误的,但我看不到任何替代方案。我不会摆脱 foreach 并让 ListView 为我发挥它的魔力..有谁知道如何做到这一点?这对我很有帮助。

我只能在我的 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 的 coden-p

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

【问题讨论】:

    标签: listview objectdatasource


    【解决方案1】:

    在页面加载中设置listview项的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();
    }
    

    数据绑定事件将为数据源中的每个对象触发 所以要在数据绑定事件中显​​示每个对象的信息,请写这个

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

    【讨论】:

    • 谢谢。我只是将 DataSource 与我的 ListView 绑定。我无法在 e.Item.DataItem 中获得“DataItem”。我不好的解决方法是使用索引 ProductCrash productCrash = _fiveLastest[index]; ,但当然不是最优的。
    • 当你说你不能从 e.Item.DataItem 获取数据项时,你的意思是你有一个异常或者你拿了一个空对象?
    • 我在我的电脑上编写了相同的代码,并且在 ListView 控件中没有使用 ObjectDataSource 和 DataSourceID 的情况下它运行良好,你得到了什么错误?
    • 您确定您拥有的 e 对象是 ListViewItemEventArgs 类型吗?
    • 是的。 protected void ListView2_ItemDataBound(object sender, ListViewItemEventArgs e) { if (e.Item.ItemType == ListViewItemType.DataItem) { Label statusLabel = (Label)e.Item.FindControl("TimeStampLabel");标签 productIDLabel = (Label)e.Item.FindControl("ProductIDLabel"); if (index
    【解决方案2】:

    每个绑定的项目都会触发一次 ItemDataBound 事件,这意味着如果您的 ObjectDataSource1 有 10 个项目,则该事件将触发 10 次。

    您所做的是将 TimeStampLabel 设置为 FiveLastest 的所有值,并且循环的最后一个值保持不变。

    基本上,去掉 foreach 循环,看看 e.Item.DataItem 属性。也就是列表视图的行所绑定的DataItem。

    【讨论】:

    • 我认为我的 ObjectDataSource1 没有绑定任何项目?我只会触发一次 ItemDataBound 事件。我想我想破解的是,一次性设置 ListView
    • 然后完全摆脱 ObjectDataSource1,并将网格绑定到 _fiveLastest 列表。然后 Spyros 发布的代码将起作用。
    • +1 票支持告诉我摆脱 ObjectDataSource1,谢谢。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多