【问题标题】:Populating listview web control from a datareader从数据阅读器填充列表视图 Web 控件
【发布时间】:2014-05-17 22:06:29
【问题描述】:

这是我第一次尝试使用列表视图,我花了一天的大部分时间都在用头撞墙试图让它发挥作用。我创建了一个列表视图,我试图用 Oracle DB 中的数据填充它。我正在尝试使用数据读取器来填充列表视图,但我很难让它工作。对于 listview 表单控件,有很多实现这一点的方法,但对于 web 控件来说却不多。任何帮助将不胜感激。

我能做到的最远的是这个:

While reader.Read

   Dim obj As New ListViewDataItem((reader(0)), (reader(1)))
   lsvGeneratedForms.Items.Add(obj)

End While

但这只允许我读取 2 个对象(我需要拉入 4 个)并且遇到类型转换错误,因为我的数据库仅包含字符串和日期数据类型。

列表视图的标记:

<div class="GeneratedFormsDivStyle" style="height:300px; overflow:scroll">
<asp:ListView runat="server" ID="lsvGeneratedForms">
    <LayoutTemplate>
        <table id="tblFormList" border="0" cellpadding="0" cellspacing="0">
           <tr style="background-color:#ccdaeb">
               <th align="left">
               <asp:Label ID="hdrAgreeNo" runat="server" Text="Agreement No"/>    </th>
               <th align="left">
               <asp:Label ID="hdrGenDate" runat="server" Text="Date Generated"/></th>
               <th align="left">
               <asp:Label ID="hdrLEAcct" runat="server" Text="Legal Entity Account"/></th>
               <th align="left">
               <asp:Label ID="hdrStatus" runat="server" Text="Status"/></th>
           </tr>
           <tr id="itemPlaceholder" runat="server"></tr>
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td>
            <asp:Label runat="server" ID="lblAgreeNo"><%#Eval("AGREEMENT_NUM")%></asp:Label></td>
            <td>
            <asp:Label runat="server" ID="lblGenDate"><%#Eval("GEN_DATE")%></asp:Label></td>
            <td>
             <asp:Label runat="server" ID="lblLEAcct"><%#Eval("LE_ACCOUNT")%></asp:Label></td>
            <td>
             <asp:Label runat="server" ID="lblStatus"><%#Eval("STATUS")%></asp:Label></td>                    
        </tr>
    </ItemTemplate>
</asp:ListView>
</div>

【问题讨论】:

  • ListView 是一个数据绑定控件。这个概念是每个“项目”对应于绑定数据源中的一个项目。该“项目”可以具有多个属性(字段)。看起来您正在尝试在后面的代码中设置所有“项目”属性。我建议更改您的方法 - 从您的数据库中创建一个“项目”集合并将该集合绑定到 ListView。例如,创建一个具有与数据绑定中的名称匹配的属性的类,构建该类的 List&lt;T&gt; 并将列表绑定到控件。

标签: asp.net vb.net listview


【解决方案1】:

为了说明我的例子,创建一个类:

Public Class MyItem

    Public Property AGREEMENT_NUM As String
    Public Property GEN_DATE As String
    Public Property LE_ACCOUNT As String
    Public Property STATUS As String
End Class

这与您在&lt;ItemTemplate&gt; 中填充的字段匹配。

接下来,您可以将阅读器的结果映射到类:

Dim myItems As List(Of MyDataItem) = New List(Of MyDataItem)()

While (reader.Read())
    Dim newItem As New MyDataItem With { .AGREEMENT_NUM = reader(0).ToString(), .GEN_DATE = reader(1).ToString(), .LE_ACCOUNT = reader(2).ToString(), .STATUS = reader(2).ToString() }
    myItems.Add(newItem)
End While  

然后就可以绑定列表了:

MyListView.DataSource = myItems
MyListView.DataBind()

上面的代码是一个示例 - 您需要针对您的代码进行相应的调整。重要的是确保您要绑定的对象集合具有标记中使用的相应字段名称。

【讨论】:

  • 谢谢蒂姆。我在以下行的语法上遇到了一些问题: Dim newItem As ListViewDataItem With { .AGREEMENT_NUM = reader(0).ToString(), .GEN_DATE = reader(1).ToString(), .LE_ACCOUNT = reader(2 ).ToString(), .STATUS = reader(3).ToString()} 我收到“预期语句结束”错误...我有什么过错?
  • @StephenT - 如果ListViewDataItem 来自System.Web.UI.Controls,您将无法执行您想要执行的操作,因为编译器无法理解这些属性。您需要使用我在示例中给出的自定义类。请注意,我的示例中有一个错字(我不经常使用 VB.NET)- 应该是 Dim newItem As New MyDataItem.... - 它缺少 New 关键字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多