【问题标题】:VB.net populating database query result to listviewVB.net 将数据库查询结果填充到列表视图
【发布时间】:2014-07-25 15:45:46
【问题描述】:

如何将数据库查询结果填充到列表视图。我遇到了“Form1.ListView1.Items(i).SubItems(1).Text = myRow.Item(0)”行的问题。

    Dim cn As New SqlConnection()
    Dim WFTeam As New DataSet()
    Dim da As SqlDataAdapter
    Dim cmdBuilder As SqlCommandBuilder
    Dim myRow As DataRow
    Dim dt As New DataTable
    Dim strSqlStm As String = ""
    Dim strConnectionString As String = ""


        strSqlStm = "SELECT [SRF#], [FirstName], [LastName] FROM [Agent] WHERE [TeamLeaderNo] = 103"
        cn.ConnectionString = strDataSource & "Initial Catalog=EmployeeDatabase;" & strUID & strPassword
        cn.Open()
        da = New SqlDataAdapter(strSqlStm, cn)
        cmdBuilder = New SqlCommandBuilder(da)
        da.Fill(WFTeam, "Team")
        WFTeam.Tables.Add(dt)
        da.Fill(dt)

        Form1.ListView1.Items.Clear()

        Dim i As Integer = 1
        For Each myRow In dt.Rows
            If Not IsDBNull(myRow.Item(0)) Then

                Form1.ListView1.Items(i).SubItems(1).Text = myRow.Item(0)
            End If
            If Not IsDBNull(myRow.Item(1)) Then
                Form1.ListView1.Items(i).SubItems(2).Text = myRow.Item(1)
            End If
            If Not IsDBNull(myRow.Item(2)) Then
                Form1.ListView1.Items(i).SubItems(3).Text = myRow.Item(2)
            End If
            i = i + 1
        Next

        cn.Close()

以下代码有效,但我需要像 Excel 一样访问特定项目

    For Each myRow In dt.Rows

    If Not IsDBNull(myRow.Item(0)) Then
       Form1.ListView1.Items.Add(myRow.Item(0))
       'Form1.ListView1.Items(i).SubItems(1).Text = myRow.Item(0)
    End If
    If Not IsDBNull(myRow.Item(1)) Then
       Form1.ListView1.Items(Form1.ListView1.Items.Count - 1).SubItems.Add(myRow.Item(1))
      'Form1.ListView1.Items(i).SubItems(2).Text = myRow.Item(1)
    End If
    If Not IsDBNull(myRow.Item(2)) Then
       Form1.ListView1.Items(Form1.ListView1.Items.Count - 1).SubItems.Add(myRow.Item(2))
      'Form1.ListView1.Items(i).SubItems(3).Text = myRow.Item(2)
   End If
   i = i + 1
   Next

【问题讨论】:

  • 马上我可以看到您正在尝试添加到一个不存在的项目。您已经清除了ListView1.Items,然后立即尝试设置Items(1).SubItems(1) 的值。您需要先发送ListView1.Items.Add()
  • “有问题”的描述性不是很好。我可以看到你清除物品;这意味着您需要使用 LV 的新数据创建新项目。清除后没有项目或子项目
  • 当第一项为 DbNull 时,新代码将不起作用 - 没有项时无法添加子项。当myRow.Item(1) 为DbNull 时,它还将myRow.Item(2) 放在第1 列中。

标签: vb.net listview


【解决方案1】:

您清除了 LV,因此没有要填充的项目或子项目。您需要创建新的 ListViewItems 并使用数据库数据填充它们。但是,如果第一次提交 IsDbNull,您的编辑会跳过添加项目,这意味着您无法为该记录添加任何内容。以下还将“锚定”数据,因此当任何子项数据 IsDbNull 时,下一个子项不会超过一个:

Form1.ListView1.Items.Clear()

Dim lvi As ListViewItem
For Each myRow In dt.Rows

    ' create NEW listview item for this row
    lvi = New ListViewItem
    If IsDBNull(myRow.Item(0)) Then
        lvi.Text = " "           ' blank Item 
    Else         
        lvi.Text = myRow.Item(0)
    End If

    ' repeat for the sub items, adding blanks when DbNull

    If IsDBNull(myRow.Item(1)) Then
        lvi.SubItems.Add(" ")
    Else
        lvi.SubItems.Add(myRow.Item(1))
    End If

    ' etc

    Form1.ListView1.Items.Add(lvi)

Next

DataGridViewListView 更适合此操作,尤其是访问类似于 Excel 的项目。我认为这意味着您希望 myRow.Item(2) 始终是第二个子项。因此,上面的代码将空项或子项添加为“占位符”。

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多