需要Listview帮助

时间:2013-12-12 11:31:59

标签: vb.net winforms listview

我很困惑成为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

1 个答案:

答案 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)。