none
Listview dinâmico com dados vindos de uma classe RRS feed

  • 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.

    segunda-feira, 25 de março de 2019 20:58

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


    terça-feira, 26 de março de 2019 16:37

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


    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...

    terça-feira, 26 de março de 2019 12:50
  • 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
    terça-feira, 26 de março de 2019 13:57
  • 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.


    terça-feira, 26 de março de 2019 14:08
  • Olá, ao meu ver seu método pode retornar a ListViewItem preenchida como resposta anterior...

    public ListViewItem inicia_formulario()
    


    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 26 de março de 2019 14:12
  • 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

    terça-feira, 26 de março de 2019 14:56
  • 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.



    terça-feira, 26 de março de 2019 15:02
  • 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.

    terça-feira, 26 de março de 2019 15:38
  • 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

    terça-feira, 26 de março de 2019 15:43
  • 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.


    terça-feira, 26 de março de 2019 15:43
  • 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

    terça-feira, 26 de março de 2019 15:46
  • Ao meu ver não estamos alterando em tempo de execução o ListView, mas sim, no método inicia_formulario estamos criando e populando o ListViewItem e depois adicionamos o range dos items ao ListView principal.
    terça-feira, 26 de março de 2019 15:52
  • 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 Ativo

    e

    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.

    terça-feira, 26 de março de 2019 15:52
  • 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

    terça-feira, 26 de março de 2019 15:57
  • Entendi Wallace, mas como eu faria isso? 
    terça-feira, 26 de março de 2019 15:57
  • 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

    terça-feira, 26 de março de 2019 16:08
  • Vamos começar modelando as consultas em uma classe separada, como já fez. Diga, quais são as colunas da tabela Consulta?

    “First do it, then do it right, then do it better.” - Addy Osmani

    terça-feira, 26 de março de 2019 16:11
  • 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

    terça-feira, 26 de março de 2019 16:18
  • Como estão mapeadas as colunas ? cd_usuario corresponde a ID? nm_usuario corresponde a Nome?

    “First do it, then do it right, then do it better.” - Addy Osmani

    terça-feira, 26 de março de 2019 16:21
  • desculpe, acabei me expressando mal.

    Estão dessa forma:

    ID        -> cd_usuario

    Nome  -> nm_usuario

    Login   -> nm_login (não havia informado antes)

    E-mail  -> ds_email

    Status  -> fg_status


    terça-feira, 26 de março de 2019 16:26
  • 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


    terça-feira, 26 de março de 2019 16:37
  • 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.

    terça-feira, 26 de março de 2019 16:54
  • 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?

    terça-feira, 26 de março de 2019 16:56
  • 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


    terça-feira, 26 de março de 2019 17:13