2017-02-07 9 views
0

Я начал изучать Visual Basic по просьбе моего работодателя, и я достиг точки в своем учебном проекте, который меня разочаровывает.Visual Basic 2015: заполнение ListView из SQL-соединения

Я пытаюсь заполнить 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 последовательности.

Я прочитал две темы о переполнении стека, два потока на Dream_In_Code и еще один на Code Guru ... все безрезультатно.

Я нашел вопрос на форумах сообщества MSDN, но он, похоже, использует Datasets, тогда как я пытаюсь изучить ADO.NET с активными подключениями ... и, боюсь, я не смог его преобразовать в нечто полезное для меня.

Вот снимок экрана окна отладки в Visual Studio:

Visual_Studio_Debug_Screen

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

SQL_Query_Screen

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

+0

Вы пытаетесь использовать 'SubItems (1)', который в этой точке не существует. Это вызывает ошибку. Я не знаком с этими элементами управления, но вам, вероятно, нужно выполнить '.SubItems.Add (someNewSubItem)' после создания собственного объекта someNewSubItem (который уже может включать свойство Text). –

ответ

0

Вы вызываете элементы (i) вместо Items.Item (i). Элементы просто возвращают коллекцию элементов в 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 
+0

Это решение сработало! Спасибо! – Kirloth

+0

@ Кирлот - рад помочь! – Phil