webruno 0 Denunciar post Postado Julho 21, 2010 Opa, beleza? Preciso de um help no seguinte: estou usando um DataGridViewComboBoxColumn em um DataGrid. Só que, pelo o que eu pude notar, o ComboBox só é realmente criado se você selecionar alguma opção dele. Se nenhuma opção for selecionada é como se ele não tivesse sido instanciado. No meu caso, nem todos os ComboBox são de preenchimento obrigatório. Então na hora de disparar o formulário eu uso o seguinte código: OdbcDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { for (int y = 0; y < this.dataGridClientes.Rows.Count; y++) { try { if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "") { ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString()); } } catch (Exception e){} } } Como este código está dentro de um For que se repete umas 4 mil vezes, acaba ficando lento de mais. Sem o try/catch o código é rapidão e não dá estouro de memória. Há outra maneira de testar se o objeto existe sem o try/catch? Obrigado pela atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Thompson 0 Denunciar post Postado Julho 21, 2010 Opa, beleza? Preciso de um help no seguinte: estou usando um DataGridViewComboBoxColumn em um DataGrid. Só que, pelo o que eu pude notar, o ComboBox só é realmente criado se você selecionar alguma opção dele. Se nenhuma opção for selecionada é como se ele não tivesse sido instanciado. No meu caso, nem todos os ComboBox são de preenchimento obrigatório. Então na hora de disparar o formulário eu uso o seguinte código: OdbcDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { for (int y = 0; y < this.dataGridClientes.Rows.Count; y++) { try { if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "") { ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString()); } } catch (Exception e){} } } Como este código está dentro de um For que se repete umas 4 mil vezes, acaba ficando lento de mais. Sem o try/catch o código é rapidão e não dá estouro de memória. Há outra maneira de testar se o objeto existe sem o try/catch? Obrigado pela atenção. Opa! Realmente, usar try/catch dentro de um for é uma opção lenta porque cada chamada a um tratamento de exceção que você faz é uma thread nova que o .net abre pra que o mecanismo não dispare um erro na tela. Por isso fica lento, o que poderia ser feito numa única thread acaba sendo feito usando zilhões de threads... No caso do seu código, eu resolveria isso testando se o objeto é nulo ou se o vetor possui length > 0. Tente algo parecido com isso: OdbcDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { for (int y = 0; y < this.dataGridClientes.Rows.Count; y++) { if(this.dataGridClientes["cbID_CLIENTE", y] != null) { if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "") { ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString()); } } } } Não testei, mas creio que o caminho seja por aí... Abraço! Compartilhar este post Link para o post Compartilhar em outros sites
webruno 0 Denunciar post Postado Julho 21, 2010 Obrigado pela atenção Thompson. Pior que não deu certo cara, olha só o erro: System.NullReferenceException was unhandled "Referência de objeto não definida para uma instância de um objeto." Isso aparece na linha do "if(this.dataGridClientes["cbID_CLIENTE", y] != null)" Eu já tinha tentado isso antes... É aquela história que falei: o DataGridViewComboBoxColumn só é realmente instanciado quando uma das opções dentro dele é selecionada. Antes disso ele "finge" que está no grid mas não está. Acho que é uma solução do .net para não ficar instanciado objeto dinâmico que talvez nem seja usado. Uma prova disso é que quando o ComboBox é mostrado no DataGrid as opções dentro dele não aparecem até que o usuário clique nele para abrí-lo. Muito obrigado. Se você ou outro usuário souber outra solução agradeço. Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Julho 22, 2010 Qual dos objetos esta retornando null? Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
webruno 0 Denunciar post Postado Julho 22, 2010 O que retorna o NullReferenceException é o dataGridClientes["cbID_CLIENTE", y]. Porém se eu seleciono uma opção dentro do Combo, não dá o erro. Como falei antes, pelo o que percebi, o ComboBox só é instanciado se uma opção é escolhida. Porém, no meu form, o usuário não é obrigado a selecionar nada. Então quando vou verificar o valor ele dá o erro de que o objeto não existe. Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
webruno 0 Denunciar post Postado Julho 22, 2010 Problema resolvido. O Thompson tinha dito para colocar: if(this.dataGridClientes["cbID_CLIENTE", y] != null) Mas o correto é: if(this.dataGridClientes["cbID_CLIENTE", y].Value != null) Por um ".Value" não funcionava, hehe. Obrigado a todos. Compartilhar este post Link para o post Compartilhar em outros sites
Luiz Gehlen 0 Denunciar post Postado Julho 27, 2010 OdbcDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { try{ for (int y = 0; y < this.dataGridClientes.Rows.Count; y++) { if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "") { ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString()); } } catch (Exception e){} } } Tambem é uma opção Compartilhar este post Link para o post Compartilhar em outros sites