Visual Basic 2015: заполнение ListView из соединения SQL

Я начал изучать Visual Basic по просьбе моего работодателя, и я достиг точки в моем учебном проекте, которая меня расстраивает.

Я пытаюсь заполнить ListView, используя данные из определенной таблицы в моей базе данных SQL, но я продолжаю получать ту же ошибку, независимо от того, как я пытаюсь ее исправить:

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:

Visual_Studio_Debug_Screen

ListView (при заполнении) должно выглядеть примерно так, как результаты SQL-запроса, показанные здесь:

SQL_Query_Screen

Я ценю любую помощь, и я благодарю вас за то, что нашли время, чтобы прочитать это.


person Kirloth    schedule 07.02.2017    source источник
comment
Вы пытаетесь использовать SubItems(1), которого на данный момент не существует. Это вызывает ошибку. Я не знаком с этими элементами управления, но вам, вероятно, потребуется выполнить .SubItems.Add(someNewSubItem) после создания надлежащего объекта someNewSubItem (который может уже включать свойство Text).   -  person Peter B    schedule 07.02.2017


Ответы (1)


Вы вызываете Items(i) вместо Items.Item(i). Items просто возвращает коллекцию элементов в 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
person Phil    schedule 07.02.2017
comment
@Kirloth - рад помочь! - person Phil; 08.02.2017