ATUALIZACAO DE UMA COMBOBOX

LAUROFELIPE 21/11/2012 11:47:17
#414524
Bom dia.

Estou desenvolvendo um aplicativo (tentando) e me deparo com um problema que não consigo solucionar.
Tenho algumas comboBox em meu form com origem em TableAdapter (DataSet) e uma rotina para preenchimento dos mesmos. A inclusão de registros funciona sem problemas.
Entretanto, na edição de um registro, só a primeira edição funciona, as seguintes retornam a mensagem de erro [Ô]O índice 0 é negativo ou esta acima da ....[Ô].
Então, preciso encerrar o aplicativo e abrí-lo novamente, e sempre só funciona a primeira edição. Já me certifiquei que após gravar as alterações produzidas pela edição do registro, as comboBox retornam ao seu estado inicial, mas não consigo encontrar a solução.
Se alguem puder orientar sobre como solucionar esta situação, antecipadamente agradeço.
Seguem abaixo o código e a mensagem retornada.

Private Function ValorComboBox(ByVal strTabela As String, ByVal strCampoPesquisa As String, ByVal strCampoRetorno As String, ByVal strChavePesquisa As String) As String
Dim objDataView As DataView
Dim strRetorno, strFiltro As String

strFiltro = strCampoPesquisa + [Ô] = [ô][Ô] + strChavePesquisa + [Ô][ô][Ô]

objDataView = Me.Db_imovelDataSet.Tables(strTabela).DefaultView
objDataView.RowFilter = strFiltro
strRetorno = objDataView(0)(strCampoRetorno).ToString

objDataView.Dispose()
Return strRetorno
End Function

Lauro
PEGUDO 21/11/2012 13:45:45
#414535
Cara,
O que você está passando de parâmetro no [txt-color=#0000f0]Tables(strTabela).[/txt-color]?

Pelo que vi sua variável [txt-color=#0000f0]strTabela[/txt-color] é do tipo string e [txt-color=#0000f0]Tables[/txt-color] espera um index do tipo numérico.
Veja meu exemplo abaixo:
Item.SubItems.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].Rows(Volta).Item(11))

Minha variável Volta é tipo Integer e vai incrementando à medida que o DataSet é percorrido.
Veja o exemplo completo:

While Not Volta = SetData.Tables.Item(0).Rows.Count
Item = frmPesquisa.ListView1.Items.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(0).ToString, SetData.Tables(0).Rows(Volta).Item(8)) [ô]Codigo
Item.SubItems.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(11)) [ô]Data
Item.SubItems.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(3)) [ô]TituloMensagem
Item.SubItems.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(2)) [ô]Autor

If Not IsDBNull(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(10)) Then
Item.SubItems.Add(SetData.[txt-color=#0000f0]Tables(0)[/txt-color].[txt-color=#e80000]Rows(Volta)[/txt-color].Item(10))
Else
Item.SubItems.Add([txt-color=#e80000][Ô][Ô][/txt-color])
End If

If Cor = 0 Then Item.BackColor = Color.White : Cor = 1 Else Item.BackColor = Color.Bisque : Cor = 0
Volta += 1
End While

Acima eu preencho um ListView com os dados que eu retornei do meu BD.
O que você deve perceber é que a minha [txt-color=#0000f0]Tables[/txt-color] (em azul) está sempre com o index Zero porque eu carreguei APENAS UMA tabela.
O que varia é a variável de [txt-color=#0000f0]Rows[/txt-color] (em vermelho), onde eu busco a linha que eu quero, pelo index dela.
OCELOT 21/11/2012 14:02:43
#414537
Resposta escolhida
Você recria esse DataSet cada vez que vai editar os dados? Acredito que não certo, então tente tirar este dispose que você está chamando no objDataView pois provavelmente você edita uma vez, ele usa o objeto e da dispose nele, na segunda vez pega o objeto que já foi feito o dispose e da o erro.
LAUROFELIPE 21/11/2012 14:16:12
#414538
Pegudo boa tarde.

Vamos tentar esclarecer melhor.
Tenho várias combobox em meu form preenchidas com datatable.fill(banco.dataset). Obviamente, uso os respectivos códigos para armazenar no registro e não as descrições.
Acontece que na primeira edição de qualquer registro, todas as combo de meu form são populadas de acordo com os registros armazenados, corretamente.
Entretanto, se numa mesma seção do aplicativo eu tentar editar outro registro, ocorre o erro mencionado na população da primeira combo.
Nas tentativas já realizadas para equacionar o problema, já refiz o preencimento de todas as combos, ao estado da abertura do aplicativo, e já verifiquei que as combos voltam ao estado inicial.
quanto aos parâmetros passados à função, temos:

strTabela -> Nome da tabela associada à combobox
strCampoPesquisa -> Chave primária de strTabela
strCampoRetorno -> Coluna que deverá retornar
strCampoPesquisa -> Código (valor numérico) que deverá selecionar a linha a ser retornada.

Só para não deixar dúvidas. Todos os códigos gravados no registro, fazem parte dos datasets, uma vez que são originários dos mesmos.
[txt-color=#e80000]Parece que o sistema não consegue reposicionar as informações, no entanto, isto só ocorre com a edição e não com a inclusão de novos registros.[/txt-color]
LAUROFELIPE 21/11/2012 14:29:15
#414541
OCELOT boa tarde.

Conforme mencionado em minha última resposta, uma de minhas tentativas foi após cada gravação/atualização do registro, preencher os datasets novamente, mas não funcionou.
Entretanto, seguindo sua orientação, apenas comentei o instrução [txt-color=#0000f0].dispose()[/txt-color], e aparentemente esta funcionando corretamente.
Retirei inclusive o instrução para re-populacionar os datasets após cada gravação.
Espero ter resolvido o problema.

ps.: a função em questão, foi copia & cola de um livro sobre Visual Basic.

Grato pela orientação. Afinal, já se iam várias horas e neurônios na tentativa de resolver a questão.
Vou dar um tempo e encerrar o tópico.
Tópico encerrado , respostas não são mais permitidas