列表视图人口错误

时间:2016-05-23 13:52:26

标签: vb.net listview

当用户按下'搜索'时,我需要填充3列。但每次我点击搜索'只显示员工ID,“名字”和“#39;也不是'姓氏'列表视图中存在。数据确实存在于我的Access数据库中,这证明了程序生成空白记录而不是空值错误。我用来填充列表视图的代码是:

        ds.Clear()
        lstClockin.Items.Clear()
        con.ConnectionString = provider & datafile
        con.Open()                                          'Open connection to the database
        sqlstatement = "SELECT * FROM [EmployeeAccounts]"
        da = New OleDb.OleDbDataAdapter(sqlstatement, con)
        da.Fill(ds, "allmembers")                           'Fill the data adapter
        con.Close()
        Dim recordCount, x As Short
        recordCount = 0
        x = 0
        recordCount = ds.Tables("allmembers").Rows.Count
        With ds.Tables("allmembers")
            Do Until x = recordCount
                lstClockin.Items.Add(.Rows(x).Item(0))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(1))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(2))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(3))
                x = x + 1
            Loop
        End With

数据库中的前3列是[员工ID],[名字]& [姓氏]

欢迎任何建议;但是我已经排除了使用DataGridView或任何控件。由于此程序需要使用ListView。谢谢你提前!

1 个答案:

答案 0 :(得分:2)

代码中有几点可以改进:

Dim SQL = "SELECT Id, Name, Fish FROM Sample"

Using dbcon As New OleDbConnection(ACEConnStr)
    Using cmd As New OleDbCommand(SQL, dbcon)

        dbcon.Open()
        Dim lvi As ListViewItem
        myLV.SuspendLayout()
        Using rdr = cmd.ExecuteReader
            Do While rdr.Read

                lvi = New ListViewItem(rdr.GetInt32(0).ToString)
                If rdr.IsDBNull(1) Then
                    lvi.SubItems.Add("")
                Else
                    lvi.SubItems.Add(rdr.GetString(1))
                End If

                If rdr.IsDBNull(2) Then
                    lvi.SubItems.Add("")
                Else
                    lvi.SubItems.Add(rdr.GetString(2))
                End If
                myLV.Items.Add(lvi)
            Loop
        End Using
        myLV.ResumeLayout()

    End Using
End Using
  • Connections和其他数据库提供程序对象分配需要释放的资源或您的应用程序将泄漏。实施Using的内容的Dispose块会关闭并为您处理它们
  • 由于您要将数据复制到控件,因此无需DataAdapterDataSetDataTable。此代码使用DataReader来获取数据。
  • 而不是SELECT *查询指定列/顺序,因此它可以使用Getxxxxx方法获取类型化数据。在这个案例中,这并不重要,因为所有内容都会转换为ListView的字符串。 lvi.SubItems.Add(rdr(COLUMN_NAME).ToString())也可以。
  • ID列似乎不太可能为null,因此代码只会检查{2}中的DbNull(DGV可以在没有帮助的情况下处理的另一件事)。
  • 由于ListView在添加项目时不是最理想且速度很慢,因此SuspendLayoutResumeLayout用于在填充时填充素材。

enter image description here

我完全不确定...the program produces a blank record的含义,但为了使用ListView,就像它是一个网格一样,View属性必须是Details并且你有在IDE中添加3列(或在代码中手动创建它们)。没有这些设置,什么都不会显示。

如果在其他地方需要/使用DataTable,您仍然可以在没有DataAdpater的情况下填充... dt.Load(cmd.ExecuteReader) For Each row As DataRow In dt.Rows lvi = New ListViewItem(row(0).ToString()) If DBNull.Value.Equals(row(1)) Then lvi.SubItems.Add("") Else lvi.SubItems.Add(row(1).ToString()) End If If DBNull.Value.Equals(row(2)) Then lvi.SubItems.Add("") Else lvi.SubItems.Add(row(2).ToString()) End If myLV.Items.Add(lvi) Next 并从中填充LV:

DataRow

这使用了不同的DBNull检查,因为它使用的是DataReader而不是ncurses