当用户按下'搜索'时,我需要填充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。谢谢你提前!
答案 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
Using
的内容的Dispose
块会关闭并为您处理它们DataAdapter
,DataSet
和DataTable
。此代码使用DataReader
来获取数据。SELECT *
查询指定列/顺序,因此它可以使用Getxxxxx
方法获取类型化数据。在这个案例中,这并不重要,因为所有内容都会转换为ListView
的字符串。 lvi.SubItems.Add(rdr(COLUMN_NAME).ToString())
也可以。DbNull
(DGV可以在没有帮助的情况下处理的另一件事)。ListView
在添加项目时不是最理想且速度很慢,因此SuspendLayout
和ResumeLayout
用于在填充时填充素材。我完全不确定...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
。