2014-07-25 107 views
0

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

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

马上我可以看到你正试图添加到一个不存在的项目。您清除了“ListView1.Items”,然后立即尝试设置“Items(1).SubItems(1)'的值。你首先需要做一个'ListView1.Items.Add()'。 “有问题”的 – helrich

+1

不是很具描述性。我可以看到你清除项目;这意味着您需要使用LV的新数据创建新项目。清除后没有项目或子项目 – Plutonix

+0

当第一个项目是DbNull时,新代码将不起作用 - 当没有项目时,不能添加子项目。当'myRow.Item(1)'为DbNull时,它还会将'myRow.Item(2)'放在第一列中。 – Plutonix

回答

0

您清除了LV,所以没有项目或子项目来填充。您需要创建新的ListViewItem并使用DB数据填充它们。但是,如果第一个字段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 

一个DataGridView会更适合这个比ListView,特别是访问类似的项目Excel中。我认为这意味着你希望myRow.Item(2)始终是第二个子项目。因此,上面的代码将空项目或子项目添加为“占位符”。

相关问题