2014-03-26 78 views
0

我在這條線得到一個錯誤:指數走出陣列vb.net的界限

 CheckedListBox3.Items.Remove(CheckedListBox3.CheckedItems(0)) 

我不明白爲什麼,因爲它讀取前兩個,但不是第三...的我的checkedlistbox1,2和3的索引是3,所以它使(0),(1)和(2)在每個時間...

請幫助我,並告訴我我錯在哪裏,因爲我不知道不明白他怎麼可能找到第一個和第二個列表框的索引,但找不到第三個列表框的索引

這是我的代碼:

cmd = New SqlCommand("SELECT serienaam, ouderdom, aantal FROM klantserie Where klantnummer = '" & klantnummer & "' ", con) 

     Dim ttr As SqlDataReader = cmd.ExecuteReader() 

     While ttr.Read = True 

      CheckedListBox1.Items.Add(ttr.Item("serienaam")) "serienaam" = a-map or c-map 
      CheckedListBox2.Items.Add(ttr.Item("ouderdom")) "ouderdom" = week1 - week16 
      CheckedListBox3.Items.Add(ttr.Item("aantal"))  "aantal" = 1 - 10 

     End While 

補充說,添加項目到CheckedListBox

Private Sub Button79_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button79.Click 



    While CheckedListBox1.CheckedItems.Count - 1 >= 0  ''i have changed this line a few times don't really know if it matters to the outcome of the error'' 

     Dim serienaam 
     Dim oud 

     Dim aantal As Integer 
     Dim bedrag As Decimal 
     Dim totaal As Decimal 

     Try 
      serienaam = CheckedListBox1.CheckedItems(0) 
      oud = CheckedListBox2.CheckedItems(0) 
      aantal = CheckedListBox3.CheckedItems(0) 
     Catch ex As Exception 

     End Try 


     cmd = New SqlCommand("SELECT " & oud & " FROM series Where naamserie = '" & serienaam & "' ", con) 

     Dim sdr As SqlDataReader = cmd.ExecuteReader() 

     If sdr.Read = True Then 
      Dim week = sdr.Item(oud) 
      bedrag = week * aantal 
      totaal = Label69.Text 
      totaal = totaal - bedrag 

      sdr.Close() 
      Label69.Text = totaal 

     End If 



     CheckedListBox1.Items.Remove(CheckedListBox1.CheckedItems(0)) 

     CheckedListBox2.Items.Remove(CheckedListBox2.CheckedItems(0)) 
     Try 
      CheckedListBox3.Items.Remove(CheckedListBox3.CheckedItems(0)) ''<<<----error 
     this try doesn't do anything actually except for the fact that im not getting any errors anymore 
     Catch ex As Exception 
      If ex IsNot Nothing Then 
       Dim s = CheckedListBox3.Items.Count 
       CheckedListBox3.SelectedItem = s 
       CheckedListBox3.Items.Remove(s) 

      End If 
     End Try 



    End While 

End Sub 

這個代碼是用以校驗碼

Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck 

    Dim index As Integer = e.Index 

    CheckedListBox2.SetItemChecked(index, e.NewValue) 
    CheckedListBox3.SetItemChecked(index, e.NewValue) 

End Sub 

我的解決方案,因爲它沒」工作。

  Private Sub Button76_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button76.Click 
    Dim serienaam 
    Dim oud 
    Dim aantal As Integer 
    Dim bedrag As Decimal 
    Dim totaal As Decimal 
    Dim t As String 

    serienaam = ComboBox6.SelectedItem 
    oud = ComboBox7.SelectedItem 
    aantal = TextBox45.Text 




    cmd = New SqlCommand("SELECT " & oud & " FROM series Where naamserie = '" & serienaam & "' ", con) 

    Dim sdr As SqlDataReader = cmd.ExecuteReader() 

    If sdr.Read = True Then 
     Dim week = sdr.Item(oud) 
     bedrag = week 
     totaal = Label69.Text 
     totaal = totaal + bedrag * aantal 



     sdr.Close() 
     Label69.Text = totaal 
     t = " '" & serienaam & "'      '" & oud & "'       '" & aantal & "' " 
     CheckedListBox1.Items.Add(t) 



    End If 


End Sub 

      Private Sub Button79_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button79.Click 



    While CheckedListBox1.CheckedItems.Count <> 0 

     Dim klantnr As String 
     Dim serienaam As String 
     Dim oud As String 
     Dim list As String 
     Dim aantal As Integer 
     Dim bedrag As Decimal 
     Dim totaal As Decimal 
     klantnr = TextBox32.Text 

     list = CheckedListBox1.CheckedItems(0) 
     Dim strlist = list.Split("'") 
     For count = 0 To strlist.Length - 1 
      serienaam = strlist(1) 
      oud = strlist(3) 
      aantal = strlist(5) 
     Next 

     cmd = New SqlCommand("SELECT " & oud & " FROM series Where naamserie = '" & serienaam & "' ", con) 

     Dim sdr As SqlDataReader = cmd.ExecuteReader() 

     If sdr.Read = True Then 
      Dim week = sdr.Item(oud) 
      bedrag = week * aantal 
      totaal = Label69.Text 
      totaal = totaal - bedrag 

      sdr.Close() 
      Label69.Text = totaal 

     End If 

     cmd = New SqlCommand("DELETE FROM klantserie Where klantnummer = '" & klantnr & "' And serienaam = '" & serienaam & "' And ouderdom = '" & oud & "' And aantal = '" & aantal & "' ", con) 

     If con.State = ConnectionState.Closed Then con.Open() 

     cmd.ExecuteNonQuery() 

     ShowData() 

     CheckedListBox1.Items.Remove(CheckedListBox1.CheckedItems(0)) 

    End While 

End Sub 
+0

你的while只檢查'CheckedListBox1.CheckedItems.Count <> 0'而不檢查另一個'CheckedListBox'。 –

+0

我的壞應該說,checkedlistboxitems是共享的。所以如果checkedlistbox1項(2)=檢查比CheckedlistBox2項(2)=也檢查CheckedlistBox3項(2)=也檢查。 – user3437057

+0

你確定'SELECT serienaam,ouderdom,aantal FROM klantserie Where klantnummer ='「&klantnummer&''」'是否恢復字段'aantl'的預期記錄數? –

回答

0

不知道如果你已經解決了這個問題,但我試圖重現問題並失敗。這是我用的:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    CheckedListBox1.Items.Clear() 
    CheckedListBox1.Items.Add("List1Item1") 
    CheckedListBox1.Items.Add("List1Item2") 
    CheckedListBox1.Items.Add("List1Item3") 

    CheckedListBox2.Items.Clear() 
    CheckedListBox2.Items.Add("List2Item1") 
    CheckedListBox2.Items.Add("List2Item2") 
    CheckedListBox2.Items.Add("List2Item3") 

    CheckedListBox3.Items.Clear() 
    CheckedListBox3.Items.Add("List3Item1") 
    CheckedListBox3.Items.Add("List3Item2") 
    CheckedListBox3.Items.Add("List3Item3") 

End Sub 

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck 

    Dim index As Integer = e.Index 

    CheckedListBox2.SetItemChecked(index, e.NewValue) 
    CheckedListBox3.SetItemChecked(index, e.NewValue) 

End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 

    While CheckedListBox1.CheckedItems.Count <> 0 

     Dim serienaam As String 
     Dim oud As String 
     Dim aantal As String 


     serienaam = CheckedListBox1.CheckedItems(0) 
     oud = CheckedListBox2.CheckedItems(0) 
     aantal = CheckedListBox3.CheckedItems(0) 

     CheckedListBox1.Items.Remove(CheckedListBox1.CheckedItems(0)) 
     CheckedListBox2.Items.Remove(CheckedListBox2.CheckedItems(0)) 
     CheckedListBox3.Items.Remove(CheckedListBox3.CheckedItems(0)) 
    End While 
End Sub 

這工作得很好。我可以使用按鈕1將項目添加到框中,然後檢查第一個框中的任何內容(根據索引檢查其他框中的相應項目 - 不會打擾列表2和3的連接)並且那麼我可以使用Button2刪除沒有錯誤的選中項。對你的唯一改變顯然是我使用了模擬數據,而不是SQL查詢。

+0

好吧用了一些ur數據和它幾乎工作唯一的問題是,當我的checkedlistbox(1,2&3)都有3個值,我選擇底部的3個值我得到一個錯誤:索引超出數組的界限。比如果我使用異常處理程序,並嘗試讓它繼續執行程序不僅刪除底部的3個值,而且還刪除了checkedlistbox的第二個值(1&2(來自checkedlistbox3的值不會被刪除)) – user3437057

+0

我設法檢查並刪除任何組合的項目,包括如果它只是最低的三個。你可以發佈完整的代碼(用固定值替換SQL的東西),包括你如何設置檢查?到目前爲止,我已經完全無法再現這個問題。 –

+0

在我的問題中發佈了代碼 - 感謝您迄今爲止的幫助 – user3437057