Usuário com melhor resposta
Listview dinâmico com dados vindos de uma classe

Pergunta
-
Ola,
estou começando em C# e estou tendo algumas dificuldades em avançar no preenchimento do listview.
Estou fazendo um sistema para cadastrar usuários. Onde a tela tem uma consulta dos usuários cadastrados.
Fiz ela funcionar diretamente com os códigos dentro do formulário. Porem quero que a mesma funcione com uma classe, creio que isso seja mais elegante ou correto.
Vou passar o que tenho, creio que vou ter muitas mudanças. Mas lembrando que esse mesmo código dentro do formulário funciona.
1 - Formulário de consulta.
Funcionalidade: na tela do cadastro do usuário, tem um botão que seta a informação
Globais.consulta == "usuario";
Quando o formulário fica ativo, ele identifica essa informação e cria as informações padrões de cada tipo de consulta.
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center); } }
2 - Classe Consulta
Funcionalidade: era para consultar e retornar as informações, sei que não esta fazendo isso, porem não sei como fazer essa transição de uma classe para o outro formulário, usando o listview.
public String inicia_formulario() { //Preenchendo COMBO BOX -> Campo if (Globais.consulta == "usuario") { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); while (reader.Read()) { if (reader["cd_usuario"] != null) { ListViewItem lvitem = LV_pesquisa.Items.Add(Convert.ToString(reader["cd_usuario"])); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return string.Empty; } }
Esse trecho do código, dentro do próprio formulário, funciona. Pois o Listview, esta ali.
if (reader["cd_usuario"] != null) { ListViewItem lvitem = LV_pesquisa.Items.Add(Convert.ToString(reader["cd_usuario"])); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } }
Se alguem puder me orientar como faço para trazer as informações que vão preencher o listview, através da consulta realizada na classe, agradeço.
Desculpe se coloquei poucas informações, não sei o que mais seria necessário.
Respostas
-
Ok, William! Segue a implementação que fiz:
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center); // Criamos um objeto do tipo Consulta Consulta objConsulta = new Consulta(); // Recuperamos uma lista de consultas Enumerable<Consulta> listaConsultas = objConsulta.ListarConsultas(); // Percorremos a lista de consultas e adicionamos cada consulta ao ListView foreach(var consulta in listaConsultas) { ListViewItem lvitem = LV_pesquisa.Items.Add(consulta.CdUsuario); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.NmUsuario)); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.NmLogin)); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.DsEmail)); if(consulta.FgStatus == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } public class Consulta { public string CdUsuario {get; set;} public string NmUsuario {get; set;} public string NmLogin {get; set;} public string DsEmail {get; set;} public string FgStatus {get; set;} public IEnumerable<Consulta> ListarConsultas() { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); List<Consulta> listaConsultas = new List<Consulta>(); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); while (reader.Read()) { listaConsultas.Add(new Consulta() { CdUsuario = Convert.ToString(reader["cd_usuario"]), NmUsuario = Convert.ToString(reader["nm_usuario"]), NmLogin = Convert.ToString(reader["nm_login"]), DsEmail = Convert.ToString(reader["ds_email"]), FgStatus = Convert.ToString(reader["fg_status"]) }); } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return listaConsultas; } }
Copie as partes que não há no seu código e teste para ver se irá funcionar. Será necessário importar alguns namespaces, provavelmente.
Observe que temos agora a classe Consulta contendo toda a lógica de busca no banco de dados, enquanto o formulário só sabe como mostrá-los.
Outra modificação que traria melhoria seria criar uma classe que faz o acesso ao banco de dados, retirando essa responsabilidade da classe Consulta. Isso também tornaria o código mais flexível, pois poderíamos utilizar a classe de banco de dados em outras partes da aplicação sem nenhuma dificuldade!
“First do it, then do it right, then do it better.” - Addy Osmani
- Editado wallacemariadeandrade terça-feira, 26 de março de 2019 16:38
- Marcado como Resposta Williamfd terça-feira, 26 de março de 2019 16:50
Todas as Respostas
-
Olá, William! Você fez a chamada para o método inicia_formulario()?
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center);
// Chama o método que carrega os dados no formulário Consulta consulta = new Consulta() consulta.inicia_formulario(); } }
Outra coisa: o método inicia_formulario() tem retorno do tipo string, porém é uma string vazia. Há alguma finalidade específica nisso?
“First do it, then do it right, then do it better.” - Addy Osmani
- Editado wallacemariadeandrade segunda-feira, 25 de março de 2019 22:13
-
Ola Wallace, obrigado por responder.
Sobre sua pergunta:
"o método inicia_formulario() tem retorno do tipo string, porém é uma string vazia. Há alguma finalidade específica nisso?"
Não ha nenhuma finalidade para isso, o coloquei ali para ir montando o código, como não sei o que retornar e não sei o que pegar para montar o formulário.
Para ser bem franco, eu estou perdido nesse ponto, não sei como o fazer e não encontrei nada similar (ou não soube pesquisar corretamente).
O que imagino é que deva ser minha solução, porem não sei como encaixar as peças, é o seguinte:
Na classe CLS_CONSULTA, não deve ter os códigos do listview
ListViewItem lvitem = LV_pesquisa.Items.Add(Convert.ToString(reader["cd_usuario"])); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); }
creio que essas informações, devam estar logo abaixo do retorno, algo parecido com isso:
// Chama o método que carrega os dados no formulário CLS_CONSULTA consulta = new CLS_CONSULTA(); consulta.inicia_formulario(); ListViewItem lvitem = LV_pesquisa.Items.Add(Convert.ToString(reader["cd_usuario"])); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); }
Mas não sei como transitar as informações de um para outro nesse caso...
-
Olá, tenta o código...
public ListViewItem inicia_formulario() { //Preenchendo COMBO BOX -> Campo if (Globais.consulta == "usuario") { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); ListViewItem lvitem = new ListViewItem(); while (reader.Read()) { if (reader["cd_usuario"] != null) { lvitem.Items.Add(Convert.ToString(reader["cd_usuario"])); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return lvitem; } }
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { Consulta consulta = new Consulta(); LV_pesquisa := consulta.inicia_formulario(); }
Se ajudou, marque como resposta! Obrigado.
- Sugerido como Resposta LeonardoBastos terça-feira, 26 de março de 2019 13:58
-
Fiz umas alterações, mas ainda estou as cegas ...
Classe Consulta:
class CLS_CONSULTA { public void inicia_formulario() { //Preenchendo COMBO BOX -> Campo if (Globais.consulta == "usuario") { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); ArrayList lista_usuarios = new ArrayList(); while (reader.Read()) { if (reader["cd_usuario"] != null) { Object[] numb = new Object[reader.FieldCount]; reader.GetValues(numb); lista_usuarios.Add(numb); } } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } } } }
mas creio que minha construção do ArrayList não esteja correta.
-
-
Ola Leonardo, obrigado por responder.
Desculpe, não tinha visto sua resposta anterior. Mudei o código para o que você me passou ali, porem o sistema não aceita.
Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão
Erro CS1061 'ListViewItem' não contém uma definição para 'Items' e não foi possível encontrar nenhum método de extensão 'Items' acessível que aceite um primeiro argumento do tipo 'ListViewItem' (há uma diretiva de uso ou referência de assembly ausente?) SISTEMA USUARIO C:\Users\William Felipe\source\repos\USUARIO\USUARIO\CLS_CONSULTA.cs 42 Ativo
vou ver o que consigo alterar aqui
-
Olá, tenta o código...
public ListViewItem inicia_formulario() { //Preenchendo COMBO BOX -> Campo if (Globais.consulta == "usuario") { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); ListViewItem lvitem = new ListViewItem(); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); while (reader.Read()) { if (reader["cd_usuario"] != null) {
lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["cd_usuario"])));
lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return lvitem; } }
Se ajudou, marque como resposta! Obrigado.
- Editado LeonardoBastos terça-feira, 26 de março de 2019 15:04
-
Ola Leonardo, sinto que a solução esta mais perto que previsto.
Tive só que mudar no seu código, a posição do
ListViewItem lvitem = new ListViewItem();
Para antes do IF, pois ainda esta informando que nem todos os caminhos tinham um retorno e colocando o retorno no final ele não reconhecia o lvitem.
ficando assim:
class CLS_CONSULTA { public ListViewItem inicia_formulario() { ListViewItem lvitem = new ListViewItem(); //Preenchendo COMBO BOX -> Campo if (Globais.consulta == "usuario") { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); while (reader.Read()) { if (reader["cd_usuario"] != null) { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["cd_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_usuario"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["nm_login"]))); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, Convert.ToString(reader["ds_email"]))); if (Convert.ToString(reader["fg_status"]) == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return lvitem; } return lvitem; } }
e no formulário:
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center); // Chama o método que carrega os dados no formulário CLS_CONSULTA consulta = new CLS_CONSULTA(); consulta.inicia_formulario(); } }
Porem ao iniciar o formulário, o listview não apresenta nenhuma informação.
Fiz um breakpoint para ver o que estava acontecendo e ele entra no while 6 vezes, que é a quantidade de usuários ativos que tenho no banco, depois que finaliza o while ele vai para o finally e volta para a chamada do metodo, porem o listview fica em branco.
-
A sua ideia está correta. O que está acontecendo é uma mistura de responsabilidades. Você observou bem que dentro da classe consulta não deve existir o código da ListView. Seria mais interessante se a classe Consulta tivesse um método que retornasse uma lista de objetos do tipo Consulta e no formulário só carregariamos os dados. Veja que dessa forma fazemos uma separação: a classe Consulta contém a lógica do negócio, enquanto o formulário se encarrega de exibir os dados.
“First do it, then do it right, then do it better.” - Addy Osmani
-
Olá, ajuste o código...
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center); // Chama o método que carrega os dados no formulário CLS_CONSULTA consulta = new CLS_CONSULTA(); LV_pesquisa.Items.AddRange(consulta.inicia_formulario()); } }
Se ajudou, marque como resposta! Obrigado.
- Editado LeonardoBastos terça-feira, 26 de março de 2019 15:48
-
Sim, porque o formulário tem um objeto ListView já armazenado em seu conjunto de controles. Esse objeto não pode ser alterado em tempo de execução, como o código do colaborador Leonardo propôs.
“First do it, then do it right, then do it better.” - Addy Osmani
-
-
Grande Leonardo,
fiz a alteração que passou, o VS retorna:
Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão
Aviso CS0164 Este rótulo não foi usado como referência SISTEMA USUARIO C:\Users\William Felipe\source\repos\USUARIO\USUARIO\FRM_CONSULTA.cs 51 Ativoe
Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão
Erro CS1525 Termo de expressão inválido "=" SISTEMA USUARIO C:\Users\William Felipe\source\repos\USUARIO\USUARIO\FRM_CONSULTA.cs 51 Ativo
desculpe, mas me falta conhecimentos para resolver isso.
-
De fato, com essa linha de código o objeto não está sendo alterado
LV_pesquisa.Items.AddRange(consulta.inicia_formulario());
No entanto, qual o retorno do método inicia_formulario() ?
“First do it, then do it right, then do it better.” - Addy Osmani
-
-
Alterei com a informação que passou, no caso mudei para:
LV_pesquisa.Items.AddRange(consulta.inicia_formulario());
Agora o VS retorna:
Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão
Erro CS1503 Argumento 1: não é possível converter de "System.Windows.Forms.ListViewItem" para "System.Windows.Forms.ListViewItem[]" SISMEI MAGAZINE C:\Users\William Felipe\source\repos\Mecanica\Mecanica\FRM_CONSULTA.cs 51 Ativo
-
-
quando se refere a tabela consulta, você quer dizer quais colunas vou informar no listview certo? ou quais colunas tenho na tabela de usuarios?
Se for a primeira opção, no listview vou mostrar
ID
Nome
Login
E-mail
Status
com esses respectivos campos no banco de dados: cd_usuario, nm_usuario,ds_email,fg_status
-
-
-
Ok, William! Segue a implementação que fiz:
private void FRM_CONSULTA_Activated(object sender, EventArgs e) { if(Globais.consulta == "usuario") { //Preenchendo COMBO BOX -> Operador CB_operador.Text = "Operador"; CB_operador.Items.Add("Igual"); CB_operador.Items.Add("Diferente"); CB_operador.Items.Add("Maior"); CB_operador.Items.Add("Menor"); CB_operador.Items.Add("Contem"); CB_campo.Text = "Campo"; CB_campo.Items.Add("Nome"); CB_campo.Items.Add("Login"); CB_campo.Items.Add("E-mail"); LV_pesquisa.Clear(); LV_pesquisa.Columns.Add("Código", 54, HorizontalAlignment.Center); LV_pesquisa.Columns.Add("Nome", 300, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Login", 186, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("E-mail", 180, HorizontalAlignment.Left); LV_pesquisa.Columns.Add("Ativo", 60, HorizontalAlignment.Center); // Criamos um objeto do tipo Consulta Consulta objConsulta = new Consulta(); // Recuperamos uma lista de consultas Enumerable<Consulta> listaConsultas = objConsulta.ListarConsultas(); // Percorremos a lista de consultas e adicionamos cada consulta ao ListView foreach(var consulta in listaConsultas) { ListViewItem lvitem = LV_pesquisa.Items.Add(consulta.CdUsuario); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.NmUsuario)); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.NmLogin)); lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, consulta.DsEmail)); if(consulta.FgStatus == "1") { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Ativo")); } else { lvitem.SubItems.Add(new ListViewItem.ListViewSubItem(null, "Inativo")); } } } } public class Consulta { public string CdUsuario {get; set;} public string NmUsuario {get; set;} public string NmLogin {get; set;} public string DsEmail {get; set;} public string FgStatus {get; set;} public IEnumerable<Consulta> ListarConsultas() { string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn); List<Consulta> listaConsultas = new List<Consulta>(); try { conexao.Open(); MySqlCommand comando = new MySqlCommand(); comando = conexao.CreateCommand(); comando.CommandText = "select * from usuario where usuario.fg_status = 1;"; MySqlDataReader reader = comando.ExecuteReader(); while (reader.Read()) { listaConsultas.Add(new Consulta() { CdUsuario = Convert.ToString(reader["cd_usuario"]), NmUsuario = Convert.ToString(reader["nm_usuario"]), NmLogin = Convert.ToString(reader["nm_login"]), DsEmail = Convert.ToString(reader["ds_email"]), FgStatus = Convert.ToString(reader["fg_status"]) }); } } catch (MySqlException msqle) { MessageBox.Show("Erro de acess ao Mysql: " + msqle.Message, "Erro"); } finally { conexao.Close(); } return listaConsultas; } }
Copie as partes que não há no seu código e teste para ver se irá funcionar. Será necessário importar alguns namespaces, provavelmente.
Observe que temos agora a classe Consulta contendo toda a lógica de busca no banco de dados, enquanto o formulário só sabe como mostrá-los.
Outra modificação que traria melhoria seria criar uma classe que faz o acesso ao banco de dados, retirando essa responsabilidade da classe Consulta. Isso também tornaria o código mais flexível, pois poderíamos utilizar a classe de banco de dados em outras partes da aplicação sem nenhuma dificuldade!
“First do it, then do it right, then do it better.” - Addy Osmani
- Editado wallacemariadeandrade terça-feira, 26 de março de 2019 16:38
- Marcado como Resposta Williamfd terça-feira, 26 de março de 2019 16:50
-
SANTA MAE DE DEUS BATMAAA funcionou
perfeito Wallace, como eu imaginava que tinha que ser, a classe intermediando entre a aplicação e o banco. Confesso que não encontrei nada dessa forma nas minhas pesquisas, mas creio que não soube pesquisar direito.
Muito obrigado Wallace, vou estudar o código que me passou para entender ele e aplicar em futuros códigos.
Ao Leonardo também, muito obrigado pela atenção.
-
Aproveitando,
"Outra modificação que traria melhoria seria criar uma classe que faz o acesso ao banco de dados, retirando essa responsabilidade da classe Consulta. Isso também tornaria o código mais flexível, pois poderíamos utilizar a classe de banco de dados em outras partes da aplicação sem nenhuma dificuldade!"
Eu tenho uma classe que tem os dados do banco de dados, usuario, senha, endereço e etc...
ai no caso uso a string:
string conn = ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ToString(); MySqlConnection conexao = new MySqlConnection(conn);
Você diz para ter outra classe, que faça esse papel?
-
Que bom que pude ajudar! Desafio -te a criar a classe Database e colocar o acesso ao banco de dados dentro dela! Será um ótimo exercício!
Aconselho também que estude sobre Design Patterns, MVC e princípios SOLID. São conhecimentos valiosos que fazem a diferença.
Sucesso nos estudos!
“First do it, then do it right, then do it better.” - Addy Osmani
- Editado wallacemariadeandrade terça-feira, 26 de março de 2019 17:17