LIST COMPARAR COM NULL OU COUNT?
Bom dia.
Estou com um problema para testar se há dados no List.
Uso o List<Entidade> para carregar dados do banco e
- povoar um DataGridView
- povoar um ComboBox
}[/c]
O problema está em fazer a comparação para saber se retornou dados, mas as vezes dá erro:
Tem lugar que faço assim:
e em outros assim:
Por algum motivo que não identifiquei, tem situações que funciona de uma forma ou de outra e as vezes dá erro ex:
Se usar o if (minhaLista == null) mesmo não tendo conteúdo, a instrução a seguir do if não é executada, e se usar o if (minhaLista.Count == 0) as vezes gera erro.
Como ter uma forma segura de saber se há dados no List sem correr risco de erro?
Estou com um problema para testar se há dados no List.
Uso o List<Entidade> para carregar dados do banco e
- povoar um DataGridView
- povoar um ComboBox
}[/c]
O problema está em fazer a comparação para saber se retornou dados, mas as vezes dá erro:
Tem lugar que faço assim:
if (minhaLista == null)
e em outros assim:
if (minhaLista.Count == 0)
Por algum motivo que não identifiquei, tem situações que funciona de uma forma ou de outra e as vezes dá erro ex:
Se usar o if (minhaLista == null) mesmo não tendo conteúdo, a instrução a seguir do if não é executada, e se usar o if (minhaLista.Count == 0) as vezes gera erro.
Como ter uma forma segura de saber se há dados no List sem correr risco de erro?
Isso dai depende de como você pega esse minhaLista, você deveria fazer de forma que garantisse sempre retornar um List mesmo vazio ou que sempre que não tenha nada retorne null.
Se não tiver controle sobre isso o que pode fazer é por as duas verificações juntas
Desta forma nunca ocorreria o erro pelo uso do operador OR de Curto Circuito, desta forma se a lista for nula ela já da como verdadeiro e não tenta verificar o count, se não for nula então ele verifica o count também.
Se não tiver controle sobre isso o que pode fazer é por as duas verificações juntas
if (minhaLista == null || minhaLista.Count == 0)
Desta forma nunca ocorreria o erro pelo uso do operador OR de Curto Circuito, desta forma se a lista for nula ela já da como verdadeiro e não tenta verificar o count, se não for nula então ele verifica o count também.
O melhor mesmo, na minha opinião é nunca trabalhar com objeto instanciado vazio, se não tem nada para mostrar, ele deve ser null. Mas a alternativa acima, usando o operador de short-circuit, é uma boa idéia. Eu, particularmente, uso um método de extensão [Ô]IsNullOrEmpty[Ô], que retorna true quando for null ou vazio.
Realmente o interessante e entender como voce cria a lista.
A lista é criada com base na entidade da classe (modelo da tabela do banco):
No formulário chamo assim:
Na DAL está assim o método que monta a lista:
Então pode trazer ou não dados, se não traz eu tenho de limpar o grid para não exibir os dados anteriores, nesse ponto estou tendo de usar:
Grid.DataSource = null
e depois remontar o grid, pois com uso de List ou DataTable ou outros objetos, não é possÃvel incluir ou excluir itens do grid via código, assim tenho de resetar total e remontar o grid a cada consulta.
No formulário chamo assim:
EmpresasBLL obj = new EmpresasBLL();
List<EmpresasModelo> listEmpresas = new List<EmpresasModelo>();
try
{
listEmpresas = obj.MontaGridViewEmpresa(myInativo);
if ((listEmpresas == null) || (listEmpresas.Count == 0))
{
MessageBox.Show(Idioma.RetornaMensagem([Ô]SemRegistrosLocalizados[Ô]), Idioma.RetornaMensagem([Ô]TituloAvisoMSG[Ô]), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
grid.DataSource = listEmpresas;
grid.RowsDefaultCellStyle.BackColor = Color.LightCyan;
grid.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;
grid.CellBorderStyle = DataGridViewCellBorderStyle.None;
grid.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
grid.AllowUserToResizeColumns = false;
}
Na DAL está assim o método que monta a lista:
public List<EmpresasModelo> MontaGridViewEmpresas(byte myInativo)
{
List<EmpresasModelo> listEmpresas = new List<EmpresasModelo>();
string mySQL = [Ô]SELECT IDEMPRESA, RAZAOSOCIAL, CNPJ, MATRIZ, INATIVO FROM EMPRESAS WHERE INATIVO = @INATIVO ORDER BY RAZAOSOCIAL asc;[Ô];
SqlCommand cmd = new SqlCommand(mySQL, Dados.cn);
cmd.Parameters.Add([Ô]@INATIVO[Ô], SqlDbType.Bit);
cmd.Parameters[[Ô]@INATIVO[Ô]].Value = myInativo;
SqlDataReader dr = null;
try
{
Dados.AbrirConexao();
dr = cmd.ExecuteReader();
while (dr.Read())
{
EmpresasModelo myEmpresa = new EmpresasModelo();
myEmpresa.IDEMPRESA = (Int32)dr[[Ô]IDEMPRESA[Ô]];
myEmpresa.RAZAOSOCIAL = (string)dr[[Ô]RAZAOSOCIAL[Ô]];
myEmpresa.CNPJ = (string)dr[[Ô]CNPJ[Ô]];
myEmpresa.MATRIZ = Convert.ToByte(dr[[Ô]MATRIZ[Ô]]);
myEmpresa.INATIVO = Convert.ToByte(dr[[Ô]INATIVO[Ô]]);
listEmpresas.Add(myEmpresa);
}
}
catch (SqlException)
{
throw;
}
catch (Exception)
{
throw;
}
finally
{
Dados.FecharConexao();
}
return listEmpresas;
}
Então pode trazer ou não dados, se não traz eu tenho de limpar o grid para não exibir os dados anteriores, nesse ponto estou tendo de usar:
Grid.DataSource = null
e depois remontar o grid, pois com uso de List ou DataTable ou outros objetos, não é possÃvel incluir ou excluir itens do grid via código, assim tenho de resetar total e remontar o grid a cada consulta.
Tópico encerrado , respostas não são mais permitidas