我很困惑成为vb.net的一个相对较新的用户。为什么我的listview没有修改列表中的值?如果可以,那么我正确地了解listview如何从数据库中显示其数据。除了我的代码问题,我还有一个普遍的问题。
我的listview中有五列(0-4)。我是否正确地说,如果我的访问数据库包含10个字段,但我只需要显示其中的5个,但其中一个是字段(9),那么将像下面的代码一样对代码进行编码,这不会改变值和只有删除'else'语句才会显示列表。
错误是什么?非常感谢
更新后的代码:
oledbCnn.ConnectionString = My.Settings.storageConnectionString
oledbCnn.Open()
'drcount = Convert.ToInt32(dr("RowCount"))
sql = "Select TOP 100 * from Requests ORDER BY [Date-time received] DESC"
Debug.Print(sql)
Dim oledbCmd As OleDbCommand = New OleDbCommand(sql, oledbCnn)
Using dr = oledbCmd.ExecuteReader()
'clear items in the list before populating with new values
'lvRequests.Items.Clear()
While dr.Read()
If dr.HasRows Then
Dim LVI As New ListViewItem
With LVI
.Text = dr(0).ToString()
.UseItemStyleForSubItems = False
.SubItems.Add(CDate(dr(5)).ToShortDateString())
.SubItems.Add(dr(1).ToString())
.SubItems.Add(dr(3).ToString())
If dr(3).ToString = "D" Then
.SubItems(3).Text = "Destroyed"
ElseIf dr(3).ToString = "O" Then
.SubItems(3).Text = "Out"
ElseIf dr(3).ToString = "I" Then
.SubItems(3).Text = "Intake"
End If
.SubItems.Add(dr(9).ToString())
If dr(9).ToString = "DEMO" Then
.SubItems(9).Text = "Done"
End If
End With
lvRequests.Items.Add(LVI)
lvcount += 1
End If
End While
End Using
答案 0 :(得分:1)
没有足够的信息确切地知道发生了什么。看起来你从数据库中拉了10列,但是如果你只将5个列发布到LV,那么应该只有5个子项。所以这是错误的:
If dr(9).ToString() = "DEMO" Then
lvRequests.Items(lvRequests.Items.Count - 1).SubItems(9).Text = "Done"
' should probably be:
If dr(9).ToString() = "DEMO" Then
lvRequests.Items(lvRequests.Items.Count - 1).SubItems(4).Text = "Done"
至少在代码中可能更清楚的是使用Names作为子项。如果您实例化SubItem对象而不是使用默认构造函数,则可以指定名称并以此方式引用它们:
Dim si As New ListViewItem.ListViewSubItem
With si
.Text = dr(X).ToString ' dunno whats in there
' this is probably not exactly right, but give the SubItem
' the same name as the db column
.Name = dr.Table.Columns(X).ColumnName
End With
thisItem.SubItems.Add(si) ' add sub to Item collection
现在,您的代码可以使用名称而不是索引:
If dr(9).ToString() = "DEMO" Then
lvReq.Items(lvReq.Items.Count - 1).SubItems("TheColumnName").Text = "Done"
它不再真正重要的是有多少列或子项。 ListViewItem.SubItems集合不要求子项名称是唯一的,因此最终可以使用相同名称的2,但如果从DR / DT / DB正确映射,它应该自行处理。 / p>
如果LV 绑定到数据源(你没说),那么可能会有与db / datasource列一样多的SubItems(从未实际使用LV)。