PROBLEMA COM DATAGRIDVIEW

LUIS.HERRERA 12/01/2015 12:06:58
#443728
Pessoal estou me deparando novamente com problemas no DataGridview.
Uso um DataReader para carregar o gri - OK
Uso os eventos:
- CellFormating (formatar o valor exibido na célula em função do valor do banco correspondente) - OK
- ColumnReaderMouseClick (limpar a seleção dos registros da grade ao clicar no cabeçalho da coluna) - OK
- DataBindingComplete (Após completar carregamento limpo todos campos do form, pois ficam com dados último registro carregado e limpo seleção grid) - ok
- SelectionChanged (para preencher todos os campos do form com os dados do registro selecionado no grid) - [txt-color=#e80000]Aparentemente Funciona[/txt-color]

Meu problema é que checando o fluxo do código, percebi que ao carregar o form e mandar carregar o grid, ele executa rotinas desnecessárias várias vezes, pois ao ser carregado ele sempre passa pelo evento SelectionChanged o que só deveria ser executado quando o formulário não estivesse sendo carregado ou o grid povoado. Para tentar evitar isso fiz o seguinte:

Criei 2 variaveis no form (formCarregando e ImpedeSelecaoLinhaNoCarregamento) no evento SelectionChanged fiz assim no início do código

  if ((formCarregando == true) || (ImpedeSelecaoLinhaNoCarregamento == true) || (grid.CurrentRow == null) || (grid.SelectedRows.Count == 0))
{
//LimparCampos();
return;
}


O que acontece é que funciona bem até o penúltimo registro a ser carregado, mas ao chegar no último ele ignora o formCarregando que passou a ser false não sei porque, parece que a última execução acontece após o form ser totalmente carregado, pois só volto formCarregando = false na última linha do form_Load. Já chequei.

O que deduzi:
- Deve ter algo oculto no datagrid que dispara o SelectionChanged depois de concluído o Form_Load, ou
- Algum outro evento é disparado após tudo feito e dispara novamente o SelectionChanged e nessa situação o formCarregando já passou a ser false, mas o estranho é que as outras situações de teste também mudaram o que se conclui que o grid foi carregado.
- Outra coisa estranha é que durante o carregamento do grid, o grid.CurrentRow == null nunca é Null, sempre tem index = 0, não entendi isso.

Um outro problema interligado, que tento cortornar e dá dor de cabeça também é ao clicar no cabeçalho (título) das colunas. Uso isso para limpar a seleção de registros no grid e em alguns casos também para ordenar os registros pela coluna clicada) - OK
Porém reparei que o datagridview associa o INDEX da CurrentRow = 0 para primeiro registro do grid e também para linha de cabeçalho das colunas, o que considero um grande ERRO. A exemplo de outros controles (combobox) o INDEX deveria ser -1 se fosse selecionada a Linha Titulo ou se não houvesse linhas selecionadas, mas ele usa o mesmo INDEX = 0, assim é impossível saber se clicou no Título ou no primeiro registro. Isso me dá muito problema, pois ao clicar num registro mudo o focu de um TabControl, mas se clicar no Título ou na área vazia do Grid (meio dele sem registros) não pode mudar o foco. Isso complica no uso do SelectionChanged e não posso usar o CLIC, pois ele é disparado clicando em qualquer lugar do grid (título, registro ou fundo do controle).

1) Alguem tem idéia de como controlar isso? Saber se clicou no Título no no primeiro Registro sem usar o Index da CurrentRow que são iguais para ambos?
2) Como evitar que o selectionchange roda o código durante o carregamento do form ou povoamento do próprio grid. Só queria que ele executasse ao selecionar um registro (pelo clique o pelas setas do teclado).
LUIS.HERRERA 12/01/2015 15:11:27
#443733
Bem comecei a fazer testes com alguns eventos do grid e consegui resolver o item 1) da minha duvida acima, interceptando o clique no título da coluna assim:

 private void grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1)
{
tabControl1.SelectedTab = atividade;
}
}


Com isso se clicar em qualquer registro ele muda de ABA, se clicar no título da coluna não faz nada, só retira a seleção dos registros no grid.

O estranho é que nesse evento o RowIndex fica = -1, mas nos demais eventos, tipo o SelectedChanged, se usar rid.CurrentRow o index do primeiro registro é igual ao da Header da coluna, ou seja, 0 (zero). Muito esquisito.
Tópico encerrado , respostas não são mais permitidas