简体   繁体   English

Listview实例子项

[英]Listview Instance Subitems

I have a goal of populating a listview from the output data of a OleDb query. 我的目标是从OleDb查询的输出数据填充列表视图。 I can correctly populate the Item and one subitem with no issue. 我可以正确地填充项目和一个子项目。 But I'm having trouble defining the other 4 subitems of each item. 但是我很难定义每个项目的其他4个子项目。

As you know, typically you define subitems with 如您所知,通常使用

ListView1.Items(0).SubItems(1).Text = "Test Item 2"

But I can't figure out how to do that when working with an instance of a Listview which populates my Control Listview at runtime. 但是我不知道如何处理在运行时填充Control Listview的Listview实例。

Here is the code I have, which sucessfully populates an item and one subitem: 这是我的代码,成功填充了一个项目和一个子项目:

    Dim conn As New System.Data.OleDb.OleDbConnection(connectionString)
    Dim com As System.Data.OleDb.OleDbCommand
    Dim reader As System.Data.OleDb.OleDbDataReader

    Try
        'Open the connection
        conn.Open()
        'Create a new instance of the command and provide the SELECT query, and the opened connection
        com = New System.Data.OleDb.OleDbCommand("SELECT * FROM Schedules", conn)
        reader = com.ExecuteReader(CommandBehavior.CloseConnection)

        'Check to see if the SELECT query returned any rows
        If reader.HasRows Then
            'If so, perform a read for each row
            While reader.Read
                'Declare a new ListViewItem, and provide the information
                'to be shown in the very first column
                Dim item As New ListViewItem(reader.Item("colName").ToString)
                'Decare a new ListViewSubItem, and provide the information
                'to be shown in the second (and so forth) column
                Dim subItem As New ListViewItem.ListViewSubItem
                subItem.Text = reader.Item("colNextRun").ToString

                'Ideally, I'd like to add "colLastRun as another sub item
                'subItem1.Text = reader.Item("colLastRun").ToString

                'Add the ListViewSubItem to the ListViewItem
                item.SubItems.Add(subItem)
                'Add the ListViewItem to the ListView
                lv.Items.Add(item)
                'Repeat until all rows have been read
            End While
        End If
        'Close the reader
        reader.Close()

    Catch ex As Exception
        'If something went sideways, make sure that you close the connection
        'before exiting the method.
        If conn.State = ConnectionState.Open Then
            'MsgBox(ex.Message)
            conn.Close()
        End If
    End Try

Well, I got an idea after reviewing my own question I posted here. 好吧,我回顾了我在这里发布的问题后,有了一个主意。 I figured it out: 我想到了:

You just have to define a second subitem.. DUH! 您只需要定义第二个子项即可。

                'Decare a new ListViewSubItem, and provide the information
                'to be shown in the second (and so forth) column
                Dim subItem As New ListViewItem.ListViewSubItem
                Dim subItem1 As New ListViewItem.ListViewSubItem()
                Dim subItem2 As New ListViewItem.ListViewSubItem
                subItem.Text = reader.Item("colNextRun").ToString
                subItem1.Text = reader.Item("colLastRun").ToString
                subItem2.Text = reader.Item("colFileLocation").ToString
                'Add the ListViewSubItem to the ListViewItem
                item.SubItems.Add(subItem)
                item.SubItems.Add(subItem1)
                item.SubItems.Add(subItem2)

Congratulations on figuring out a fix. 祝贺您找出解决方案。 You have done a very good job with your connection but connections need to be not only closed but disposed. 您在连接方面做得非常好,但是不仅需要关闭连接,而且还必须处理掉连接。 Look into Using blocks which take care of both for you. 查看使用可为您兼顾的模块。 They will close and dispose your database objects even if there is an error. 即使出现错误,它们也会关闭并处置您的数据库对象。

You don't need to create a subitems object for each subitem. 您无需为每个子项目创建一个子项目对象。 The .Add method of the sub items collection can take a string which will provide the text for that subitem. 子项集合的.Add方法可以使用一个字符串,该字符串将提供该子项的文本。 Internally it will create the subitem and add it to the collection. 在内部,它将创建子项并将其添加到集合中。

Note the use of .BeginUpdate and .EndUpdate on the ListView. 请注意在ListView上使用.BeginUpdate.EndUpdate If you are adding many items this will speed things up considerably. 如果要添加许多项目,这将大大加快速度。 It prevents the control from repainting on each addition. 它可以防止控件在每次添加时重新绘制。 It will repaint once when you finish adding all the items. 完成添加所有项目后,它将重新绘制一次。

Private Sub FillListView()
    Using conn As New OleDbConnection("Your connection string")
        Using cmd As New OleDbCommand("SELECT * FROM Schedules", conn)
            conn.Open()
            Using reader = cmd.ExecuteReader
                ListView1.BeginUpdate()
                While reader.Read
                    Dim item As New ListViewItem(reader.Item("colName").ToString)
                    item.SubItems.Add(reader.Item("NextcolName").ToString)
                    item.SubItems.Add(reader.Item("NextcolName").ToString)
                    item.SubItems.Add(reader.Item("NextcolName").ToString)
                    ListView1.Items.Add(item)
                End While
                ListView1.EndUpdate()
            End Using
        End Using
    End Using
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM