2017-02-07 1 views
0

Ich fing an, auf Anfrage meines Arbeitgebers Visual Basic zu lernen, und ich habe einen Punkt in meinem Lernprojekt erreicht, das mich frustriert.Visual Basic 2015: Auffüllen eines ListView von SQL-Verbindung

Ich versuche in meiner SQL-Datenbank ein Listview unter Verwendung von Daten aus einer bestimmten Tabelle zu füllen, aber ich erhalte die gleichen Fehler, egal wie ich versuche, es zu beheben:

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

Hier die ist Code, der die Ausnahme der Erzeugungs:

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 

die Ausnahme tritt auf der dritten Zeile der While qsResult.Read Sequenz.

Ich habe zwei Threads auf Stack Overflow, zwei Threads auf Dream_In_Code und eine andere auf Code Guru gelesen ... alles vergebens.

Ich habe eine Frage in MSDN Community-Foren gefunden, aber es scheint Datasets zu verwenden, während ich versuche, ADO.NET mit aktiven Verbindungen zu lernen ... und ich fürchte, ich konnte es nicht konvertieren in etwas Brauchbares für mich.

Hier ist ein Screenshot der Debug-Fenster von Visual Studio:

Visual_Studio_Debug_Screen

Die ListView (nach Bevölkerung) so etwas wie die Ergebnisse der SQL-Abfrage hier gezeigt aussehen:

SQL_Query_Screen

Ich freue mich über jede Hilfe, und ich danke Ihnen, dass Sie sich die Zeit genommen haben, dies zu lesen.

+0

Sie versuchen, 'SubItems (1)' zu verwenden, die zu diesem Zeitpunkt nicht existiert. Das verursacht den Fehler. Ich bin nicht vertraut mit diesen Steuerelementen, aber Sie müssen wahrscheinlich '.SubItems.Add (someNewSubItem)' nach dem Erstellen eines richtigen 'someNewSubItem' -Objekts (die möglicherweise bereits die Eigenschaft Text enthalten) .. –

Antwort

0

Sie rufen Items (i) anstelle von Items.Item (i) auf. Elemente geben nur die Auflistung der Elemente in der ListView zurück. Sie benötigen Items.Item (i) .SubItems zu nennen ...

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 

Ich würde vorschlagen, es wie unten obwohl tun, wo Sie eine Reihe von Werten zu Ihrem ListViewItem passieren. Weniger anfällig für Fehler.

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

Diese Lösung hat funktioniert! Vielen Dank! – Kirloth

+0

@Kirloth - froh zu helfen! – Phil

Verwandte Themen