VB2008: ArgumentOutOfRangeException was unhandled

tds

Power Member
Boas!

Durante o estudo dum programa que peguei, apareceu um erro que eu não o percebo.
Ao carregar pela primeria vez num botão, ele faz-o perfeitamente.

Ao carregar nele uma segudna vez, já dá erro.

Código:
For i As Integer = 0 To dtSet.Tables(bdTables(0)).Rows.Count - 1
            tsProdutos.Items.Add(dtSet.Tables(bdTables(0)).Rows(i).Item(1))
            MessageBox.Show(i)
        Next
        If frmMain.lstProdutos.SelectedItems.Count > 0 Then
            tsProdutos.SelectedIndex = frmMain.lstProdutos.SelectedIndex

        Else
            tsProdutos.SelectedIndex = 0
        End If
InvalidArgument=Value of '0' is not valid for 'SelectedIndex'. Parameter name: SelectedIndex


O erro varia entre esta linha
Código:
tsProdutos.SelectedIndex = 0
e esta
Código:
tsProdutos.SelectedIndex = frmMain.lstProdutos.SelectedIndex

Alguma ajuda?
Cumpz
 
A meu ver, o teu erro resolve-se eliminando a linha

Código:
Else
    tsProdutos.SelectedIndex = 0

e ficando só com o IF desta forma:

Código:
If frmMain.lstProdutos.SelectedItems.Count > 0 Then
    tsProdutos.SelectedIndex = frmMain.lstProdutos.SelectedIndex
End If

Digo isto porque, seguindo a lógica do IF, se não existem items seleccionados, e como na maioria dos objectos os indexs são Zero-based, ao estares a dizer que o .SelectedIndex = 0 estás a dizer ao objecto para seleccionar o primeiro item. Como o objecto não tem items para seleccionar dá-te erro.

Podes também trocar para .SelectedIndex = -1 mas isso não funciona em todos os objectos e como não sei que tipo de objecto o tsProdutos é, não te posso garantir que resolva mas experimenta.

Em relação ao erro aparecer nesta linha:

Código:
tsProdutos.SelectedIndex = frmMain.lstProdutos.SelectedIndex

tens que ter em atenção um promenor. Pelo que reparei tu estás a preencher a lista com dados vindos da base de dados, e pelo que me deu a entender, o numero de items que estás a adicionar pode ser diferente do numero de items que tens no objecto lstProdutos, logo se no lstProdutos, o Index seleccionado for maior do que o numero de items que tens no objecto tsProdutos, o programa vai arrebentar.

Espero que a minha análise do teu código esteja correcta e que a resposta te ajude :)
 
Tal como dizias, a tua análise estava correcta, muito obrigado!

Implementei uma maneira de ver o tamanho do dataset e realmente ele fica com o valor de -1, e isso eu não estou a perceber porquê.

O que se passa é que ele "salta" linhas de código...

Código:
frmMain.statusBarProgress1.Value = 25
        MessageBox.Show(dtSet.Tables(bdTables(0)).Rows.Count - 1)
        For i As Integer = 0 To dtSet.Tables(bdTables(0)).Rows.Count - 1
            tsProdutos.Items.Add(dtSet.Tables(bdTables(0)).Rows(i).Item(1))
            MessageBox.Show(i)
        Next
        If frmMain.lstProdutos.SelectedItems.Count > 0 Then
            tsProdutos.SelectedIndex = frmMain.lstProdutos.SelectedIndex
        Else
            tsProdutos.SelectedIndex = 0
        End If
Este é o código. O que o compilador (ou outra coisa qualquer, não sei D: ) me está a fazer é saltar o ciclo For, e por isso é que o dataset fica a -1 (certo? D: )...

Alguma ideia para isto não acontecer? D:


tkz []
 
Hm... afinal ele depois de fechar a janela que mostra a tabela, fica a assumir o dataset tables com valor de -1 D:

Porquoi? D:
 
Normalmente, quaisquer variáveis/dados que tenhas num formulário costumam passar a 0/empty/nothing dependendo do tipo de váriavel porque elas só estão activas enquanto o formulário estiver ligado.

Se queres passar dados de um formulário para outro, convêm passares os dados antes de fechares o formulário. Das três uma:

1- Ou abres o segundo formulário, corres o código que tem que ser corrido e depois fechas o primeiro formulário (o tal que contem os dados).

2- Ou passas os dados num parametro de uma função.

3- Ou metes os dados num modulo e passam a ficar acessiveis em qualquer parte do programa, a qualquer altura.
 
Obrigado pela ajuda! =D

Consegui "saltar" o erro... penso que para a resolução da amneira de como estavas a dizer, como nem eu ainda percebi bem o programa e preciso de ser o mais rápido possivel a fazer o projecto, o que eu fiz foi "recarregar" o valor antes de abrir a nova form... não é tão "engenhoso", mas serve até ver! ;)

Já agora, estou a tentar também fazer... ora bem - Na aplicação, gerar um novo produto - que é criado também na base de dados (access), mas queria que o produto fosse criado já com matérias primas pré-definidas. Como posso implementar isso? Faço um "script" na base de dados que sempre que um produto seja criado, preenche com determinados valores ou faço ao nivel da aplicação?

Vou andar À procura de tutoriais para isto... Obrigado pela ajuda ;)

Like u say-> Quem sabe sabe, quem não sabe usa o google :D xD
 
Última edição:
Lol.. Eu também tou a fazer quote a um gajo aqui do forum. :)

Em relação ao teu problema, acho que o "script" a nível da base de dados é melhor porque se mais tarde quiseres alterar os items iniciais com que o produto é iniciado, basta ires ao "script" e alteras lá. Não necessitas de mexer no código do programa.
 
k, tkz pla dica =D

Hm... agora... Outra dúvida... Como raio vou criar isso?! xD

Há alguma ferramenta no access que permite fazer isso?
Ou faço um "à lá pate"?
 
sinceramente não uso acess, nem nunca me dei ao trabalho de abrir e ver como funciona.. lembro-me de ter dado no meu curso profissional no 2º do curso mas não me lembro como funciona.

em Sql sabia-te explicar mas em acess não sei, mas decerteza que a quem te saiba responder :)
 
k, tkz na mesma ;)

Em principio farei um script no programa D: o programa a ir buscar valores À base de dados de um determinado produto (selecionar um para ficar predefinido) e adicionar sempre essas matrizes do produto ao novo produto introduzido D:

... Quem não tem cão, caça com gato :D isso ou nem sequer caça D: xD
 
Back
Topo