ERRO CLICANDO OS TITULOS DE COLUNAS DATAGRIDVIEW
Caros amigos,
Preciso de ajuda no seguinte problema:
Tenho 2 datagridview que se relacionam, isto e, quando movimento as linhas do de cima, o de baixo e totalmente preenchido. Uma relação pai e filho.
Ao detectar o movimento do grid de cima com o evento _SelectionChanged, é chamada uma funcao que popula o dataset do grid de baixo. Para popular esse dataset é utilizada uma chave (campo) que consta na linha escolhida no de cima.
Tudo isso descrito acima funciona perfeitamente, mas quando eu clico no titulo de uma coluna qualquer do grid de cima para simplesmente sortea-lo, ocorre um erro de excecao (Referência de objeto não definida para uma instância de um objeto).
Este erro ocorre justamente quando dentro da funcao que vai preencher o grid de baixo, há a tentiva de pegar a tal chave que vai selecionar os registros para o dataset:
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value
Note que o nome da chave que consta no grid de cima é “cd_processo_deâ€, e é ao referencia-la que da o tal erro.
Note também que se não fosse o click no titulo da coluna tudo funcionaria perfeitamente.
Porque ao clicar no titulo da coluna do grid pai e automaticamente chamar o evento citado acima para preecher o grid filho a referencia do objeto e perdida?
Obrigado
Preciso de ajuda no seguinte problema:
Tenho 2 datagridview que se relacionam, isto e, quando movimento as linhas do de cima, o de baixo e totalmente preenchido. Uma relação pai e filho.
Ao detectar o movimento do grid de cima com o evento _SelectionChanged, é chamada uma funcao que popula o dataset do grid de baixo. Para popular esse dataset é utilizada uma chave (campo) que consta na linha escolhida no de cima.
Tudo isso descrito acima funciona perfeitamente, mas quando eu clico no titulo de uma coluna qualquer do grid de cima para simplesmente sortea-lo, ocorre um erro de excecao (Referência de objeto não definida para uma instância de um objeto).
Este erro ocorre justamente quando dentro da funcao que vai preencher o grid de baixo, há a tentiva de pegar a tal chave que vai selecionar os registros para o dataset:
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value
Note que o nome da chave que consta no grid de cima é “cd_processo_deâ€, e é ao referencia-la que da o tal erro.
Note também que se não fosse o click no titulo da coluna tudo funcionaria perfeitamente.
Porque ao clicar no titulo da coluna do grid pai e automaticamente chamar o evento citado acima para preecher o grid filho a referencia do objeto e perdida?
Obrigado
a celula do datagrid tem algum valor?
tenta fazer assim.
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value.tostring
tenta colocar dentro de um try catch
Abraços.
tenta fazer assim.
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value.tostring
tenta colocar dentro de um try catch
Abraços.
Caro amigo, obrigado pela ajuda,
mas infelizmente nao funcionou.
Quanto ao try catch nao me parece interessante pois isso pode esconder outros erros que podem vir a ocorrer.
So para frisar, note que tudo funciona perfeitamente bem, ao mudar de linha no grid pai o filho e todo atualizado utilizando a chave (como se fossem duas combos, a primeira ESTADO e a segunda CIDADE, e que sempre que eu mudo o ESTADO as CIDADES sao trocadas na segunda combo).
Simplesmente quando clico em uma coluna para sortear, o evento que detecta a mudanca de linha e chamado e este chama uma funcao que atualiza o datagrid filho de acordo com a chave que consta no datagrid pai.
Talvez fosse interessante saber o que o datagrid faz exatamente quando solicitado o seu sorteio via click no titulo da coluna. Sera que ele reposiciona o ponteiro da linha e com isso o CURRENTROW se perde? nao sei.
De qualquer forma continuo tentando uma solucao e aguardando dicas dos amigos.
valeu
mas infelizmente nao funcionou.
Quanto ao try catch nao me parece interessante pois isso pode esconder outros erros que podem vir a ocorrer.
So para frisar, note que tudo funciona perfeitamente bem, ao mudar de linha no grid pai o filho e todo atualizado utilizando a chave (como se fossem duas combos, a primeira ESTADO e a segunda CIDADE, e que sempre que eu mudo o ESTADO as CIDADES sao trocadas na segunda combo).
Simplesmente quando clico em uma coluna para sortear, o evento que detecta a mudanca de linha e chamado e este chama uma funcao que atualiza o datagrid filho de acordo com a chave que consta no datagrid pai.
Talvez fosse interessante saber o que o datagrid faz exatamente quando solicitado o seu sorteio via click no titulo da coluna. Sera que ele reposiciona o ponteiro da linha e com isso o CURRENTROW se perde? nao sei.
De qualquer forma continuo tentando uma solucao e aguardando dicas dos amigos.
valeu
dgvContratoProcesso.CurrentRow pode retornar um valor nulo (Nothing) caso não tenha nenhuma célula selecionada no grid, o que provavelmente ocorre quando se clica no cabeçalho da coluna.
Caro OCELOT,
é provavel que seja isso mesmo.
Provavelmente antes de receber o valor da chave na linha corrente devo testar se a validade da operacao ou se existe linha selecionada.
Em caso de problema devo selecionar uma linha, no caso o a primeira (topo) do datagridview.
Voce por acaso poderia me ajudar nisso pois estou encontrando alguma dificuldade.
Primeiro, antes de pegar a chave testar se o comando e valido, isto e, se de acordo com o que suspeitamos nao tem linha selecionada.
E segundo como selecionar uma linha, no meu caso, sempre o topo.
Valeu
é provavel que seja isso mesmo.
Provavelmente antes de receber o valor da chave na linha corrente devo testar se a validade da operacao ou se existe linha selecionada.
Em caso de problema devo selecionar uma linha, no caso o a primeira (topo) do datagridview.
Voce por acaso poderia me ajudar nisso pois estou encontrando alguma dificuldade.
Primeiro, antes de pegar a chave testar se o comando e valido, isto e, se de acordo com o que suspeitamos nao tem linha selecionada.
E segundo como selecionar uma linha, no meu caso, sempre o topo.
Valeu
o Datagrid que está sendo manipulado, tem alguma linha?
Pois já ocorreu o seguinte comigo, tinha um datagrid, que no evento click, verificava se uma celula continha algum valor, neste caso, não havia linhas(rows) e ocasionava erro.
Resolvi assim.
if datagridview.rowcount > 0 then
[ô]comando
end if
tenta fazer isto com o seu codigo
if dgvContratoProcesso.rowcount > 0 then
if dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value <> nothing then
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value
end if
end if
Abraços.
Pois já ocorreu o seguinte comigo, tinha um datagrid, que no evento click, verificava se uma celula continha algum valor, neste caso, não havia linhas(rows) e ocasionava erro.
Resolvi assim.
if datagridview.rowcount > 0 then
[ô]comando
end if
tenta fazer isto com o seu codigo
if dgvContratoProcesso.rowcount > 0 then
if dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value <> nothing then
cdproc = dgvContratoProcesso.CurrentRow.Cells([Ô]cd_processo_de[Ô]).Value
end if
end if
Abraços.
Caro GUIMORAES123,
resolvi o problema com a sua dica de testar o row.count antes de chamar a funcao e funcionou perfeitamente.
E o pior de tudo é que em outro ponto do sistema eu uso esta tecnica, mas por coincidencia la tambem dava erro quando clicava no cabecalho. Agora pela manha, depois da sua mensagem coloquei o teste e funcionou. Na outro que ja tinha esse teste percebi que o erro era no select que monta o dataset e que so aparecia quando clicava no cabecalho, e ai o idiota aqui nao percebeu.
Valeu pessoal, obrigado a todos.
resolvi o problema com a sua dica de testar o row.count antes de chamar a funcao e funcionou perfeitamente.
E o pior de tudo é que em outro ponto do sistema eu uso esta tecnica, mas por coincidencia la tambem dava erro quando clicava no cabecalho. Agora pela manha, depois da sua mensagem coloquei o teste e funcionou. Na outro que ja tinha esse teste percebi que o erro era no select que monta o dataset e que so aparecia quando clicava no cabecalho, e ai o idiota aqui nao percebeu.
Valeu pessoal, obrigado a todos.
Tópico encerrado , respostas não são mais permitidas