Visual Basic 2015:从 SQL 连接填充 ListView

Visual Basic 2015: Populating a ListView from SQL Connection

我应雇主的要求开始学习 Visual Basic,但我在学习项目中遇到了一个让我感到沮丧的阶段。

我正在尝试使用 SQL 数据库中特定 table 的数据来填充 ListView,但无论我如何尝试修复它,我都会不断收到相同的错误:

Argument Out of Range Exception - Invalid Argument=Value of '1' is not valid for 'index'.

这是生成异常的代码:

Private Sub MasterListSeries_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     lvMasterListSeries.Columns.Add("Unique ID", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Working Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Book Count", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Genre", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Published Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Started", 85, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Completed", 85, HorizontalAlignment.Center)

     Using myConnection As New SqlConnection(dbConnection)
         myConnection.Open()
         Dim Count As Integer
         Dim i As Integer = 0
         Using CountRows As New SqlCommand("SELECT Count(uniqueID) FROM tblSeries", myConnection)
             Count = Convert.ToDecimal(CountRows.ExecuteScalar)
         End Using
         Using querySeries As New SqlCommand("SELECT uniqueID, workingtitle, forecastedbookcount, genre, publishedtitle, datestarted, datecompleted FROM tblSeries", myConnection)
             Dim qsResult As SqlDataReader = querySeries.ExecuteReader()
             While qsResult.Read
                 i = Convert.ToDecimal(qsResult("uniqueID"))
                 lvMasterListSeries.Items.Add(New ListViewItem(Convert.ToString(qsResult("uniqueID"))))
                 lvMasterListSeries.Items(i).SubItems(1).Text = Convert.ToString(qsResult("workingtitle"))
                 lvMasterListSeries.Items(i).SubItems(2).Text = Convert.ToString(qsResult("forecastedbookcount"))
                 lvMasterListSeries.Items(i).SubItems(3).Text = Convert.ToString(qsResult("genre"))
                 lvMasterListSeries.Items(i).SubItems(4).Text = Convert.ToString(qsResult("publishedtitle"))
                 lvMasterListSeries.Items(i).SubItems(5).Text = Convert.ToString(qsResult("datestarted"))
                 lvMasterListSeries.Items(i).SubItems(6).Text = Convert.ToString(qsResult("datecompleted"))
             End While
         End Using
     End Using
 End Sub

异常发生在While qsResult.Read序列的第三行。

我已经阅读了 Stack Overflow 上的两个话题,Dream_In_Code 上的两个话题,以及 Code Guru 上的另一个话题……都无济于事。

我在 MSDN 的社区论坛上发现了一个问题,但它似乎正在使用数据集,而我正在尝试通过活动连接学习 ADO.NET...恐怕我做不到把它变成对我有用的东西。

这是 Visual Studio 的调试 window 的屏幕截图:

Visual_Studio_Debug_Screen

ListView(基于填充)应该类似于此处显示的 SQL 查询的结果:

SQL_Query_Screen

感谢任何帮助,感谢您抽出宝贵时间阅读本文。

您调用的是 Items(i) 而不是 Items.Item(i)。 Items 只是 returns ListView 中的项目集合。你需要调用 Items.Item(i).SubItems...

Private Sub MasterListSeries_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     lvMasterListSeries.Columns.Add("Unique ID", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Working Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Book Count", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Genre", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Published Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Started", 85, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Completed", 85, HorizontalAlignment.Center)

     Using myConnection As New SqlConnection(dbConnection)
         myConnection.Open()
         Dim Count As Integer
         Dim i As Integer = 0
         Using CountRows As New SqlCommand("SELECT Count(uniqueID) FROM tblSeries", myConnection)
             Count = Convert.ToDecimal(CountRows.ExecuteScalar)
         End Using
         Using querySeries As New SqlCommand("SELECT uniqueID, workingtitle, forecastedbookcount, genre, publishedtitle, datestarted, datecompleted FROM tblSeries", myConnection)
             Dim qsResult As SqlDataReader = querySeries.ExecuteReader()
             While qsResult.Read
                 i = Convert.ToDecimal(qsResult("uniqueID"))
                 lvMasterListSeries.Items.Add(New ListViewItem(Convert.ToString(qsResult("uniqueID"))))
                 lvMasterListSeries.Items.Item(i).SubItems(1).Text = Convert.ToString(qsResult("workingtitle"))
                 lvMasterListSeries.Items.Item(i).SubItems(2).Text = Convert.ToString(qsResult("forecastedbookcount"))
                 lvMasterListSeries.Items.Item(i).SubItems(3).Text = Convert.ToString(qsResult("genre"))
                 lvMasterListSeries.Items.Item(i).SubItems(4).Text = Convert.ToString(qsResult("publishedtitle"))
                 lvMasterListSeries.Items.Item(i).SubItems(5).Text = Convert.ToString(qsResult("datestarted"))
                 lvMasterListSeries.Items.Item(i).SubItems(6).Text = Convert.ToString(qsResult("datecompleted"))
             End While
         End Using
     End Using

 End Sub

不过,我建议像下面那样进行操作,将值数组传递给 ListViewItem。不易出错。

Private Sub MasterListSeries_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     lvMasterListSeries.Columns.Add("Unique ID", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Working Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Book Count", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Genre", 75, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Published Title", 100, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Started", 85, HorizontalAlignment.Center)
     lvMasterListSeries.Columns.Add("Date Completed", 85, HorizontalAlignment.Center)

     Using myConnection As New SqlConnection(dbConnection)
         myConnection.Open()
         Dim Count As Integer
         Dim i As Integer = 0
         Using CountRows As New SqlCommand("SELECT Count(uniqueID) FROM tblSeries", myConnection)
             Count = Convert.ToDecimal(CountRows.ExecuteScalar)
         End Using
         Using querySeries As New SqlCommand("SELECT uniqueID, workingtitle, forecastedbookcount, genre, publishedtitle, datestarted, datecompleted FROM tblSeries", myConnection)
             Dim qsResult As SqlDataReader = querySeries.ExecuteReader()
             While qsResult.Read
                 lvMasterListSeries.Items.Add(
                    New ListViewItem({
                        Convert.ToString(qsResult("uniqueID")),
                        Convert.ToString(qsResult("workingtitle")),
                        Convert.ToString(qsResult("forecastedbookcount")),
                        Convert.ToString(qsResult("genre")),
                        Convert.ToString(qsResult("publishedtitle")),
                        Convert.ToString(qsResult("datestarted")),
                        Convert.ToString(qsResult("datecompleted")      
                    })
                 )
             End While
         End Using
     End Using

 End Sub