none
Como preencher um Combobox usando C# + ADO + SQL Server?

    Pergunta

  • Amigos, eu trabalho com LINQ, e essa é minha única experiência em C#.

    Preencho grid, combobox, e tudo o mais apenas utilizando o seguinte código:

                Entidade db = new Entidade();
               
                //GRID           
                var Grid = from p in db.Produto select p;
                datagridview1.DataSource = Grid;

                //COMBOBOX
                var Combo = (from p in db.Produto
                             select new
                                 {
                                     desc = p.descricao,
                                     cod = p.codigo
                                 });

                comboBox1.DataSource = Combo;

                foreach (var p in Combo)
                {
                    comboBox1.DisplayMember = "desc";
                    comboBox1.ValueMember = "cod";
                }



    Super fácil e simples. Mas essa é a única maneira que eu conheço.
    Estou começando um projeto próprio, para estudos, e estou utilizando somente ADO, pra conhecer a metodologia.
    Já faço inserts, updates e deletes, e preencho um grid.
    Mas estou com muita dificuldade pra preencher o Combo, com displaymember e valuemember.
    Estou perdido na infinidade de DataReader, TableAdapter, DataTable, SqlReader, DataSet,DataAdapter!!!!

    Como eu faria com C# + ADO + SQL SERVER?
    segunda-feira, 4 de janeiro de 2010 21:59

Respostas

  • Olá Daniel

    combobox1.DataSource = ...... // aqui voce pode atribuir um DataTable ou um List<T> por exemplo

    Exemplo (a grosso modo):

    // string de conexao
    stringConexao = @"Data Source=.\SQLEXPRESS;Initial Catalog=TESTE;Integrated Security=True";

    // sua consulta
    sql = "SELECT * FROM TABELA";

    // criando um data adapter
    SqlDataAdapter da = new SqlDataAdapter(sql, stringConexao);

    // criando um data table para guardar os dados 
    DataTable dtResultado = new DataTable();

    // preenchendo o data table usando o metodo Fill do adapter
    da.Fill(dtResultado);

    // agora que voce já tem um DataTable populado, é só atribui-lo ao datasource do combobox
    combobox1.DataSource = dtResultado;

    Agora sobre o que o mercado utiliza é relativo, mas nunca vi ninguem usando DataSets tipados, SqlDataSource etc...

    Algumas dicas:

    - Procure ler sobre desenvolvimento em camadas
    - Quando já tiver um bom conhecimento sobre orientacao a objetos (IMPRESCINDIVEL), leia sobre padroes de projeto (design patterns)
    - Pesquise tambem sobre ORM (NHibernate, EntityFramework)

    Para voce que está começando, dê uma olhada no site do Macoratti que tem uma penca de artigos legais sobre o mencionado acima.

    []s








    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    terça-feira, 5 de janeiro de 2010 22:01

Todas as Respostas

  • Olá

    DisplayMember e ValueMember dentro de um loop??? Não há necessidade.. eles so precisam ser "setados" uma unica vez, pois apenas indicam quais sao os campos a exibir (DisplayM.....) e a pegar o valor (ValueM...).

    Não sei bem o que voce quis dizer com "utilizando somente ADO" mas voce preenche o combo exatamente (fora a obs. inicial) como vc fez no exemplo:

    combobox1.DataSource = ...... // aqui voce pode atribuir um DataTable ou um List<T> por exemplo

    Depois "sete" os DisplayMember e ValueMember....

    Se voce está trabalhando com os wizards e DataSet tipados.. recomendo somente para estudo mesmo. Ninguem utiliza.

    Qualquer coisa, estamos aí.

    []s
    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Sugerido como Resposta Danimar Ribeiro quinta-feira, 21 de janeiro de 2010 11:48
    terça-feira, 5 de janeiro de 2010 03:05
  • Bom e como eu atribuo o datasource sem utilizar LINQ?

    E o que o pessoal utiliza e o que não utiliza em ADO?

    Estou começando os estudos, gostaria de aprender o que o mercado utiliza!
    terça-feira, 5 de janeiro de 2010 10:15
  • Olá Daniel

    combobox1.DataSource = ...... // aqui voce pode atribuir um DataTable ou um List<T> por exemplo

    Exemplo (a grosso modo):

    // string de conexao
    stringConexao = @"Data Source=.\SQLEXPRESS;Initial Catalog=TESTE;Integrated Security=True";

    // sua consulta
    sql = "SELECT * FROM TABELA";

    // criando um data adapter
    SqlDataAdapter da = new SqlDataAdapter(sql, stringConexao);

    // criando um data table para guardar os dados 
    DataTable dtResultado = new DataTable();

    // preenchendo o data table usando o metodo Fill do adapter
    da.Fill(dtResultado);

    // agora que voce já tem um DataTable populado, é só atribui-lo ao datasource do combobox
    combobox1.DataSource = dtResultado;

    Agora sobre o que o mercado utiliza é relativo, mas nunca vi ninguem usando DataSets tipados, SqlDataSource etc...

    Algumas dicas:

    - Procure ler sobre desenvolvimento em camadas
    - Quando já tiver um bom conhecimento sobre orientacao a objetos (IMPRESCINDIVEL), leia sobre padroes de projeto (design patterns)
    - Pesquise tambem sobre ORM (NHibernate, EntityFramework)

    Para voce que está começando, dê uma olhada no site do Macoratti que tem uma penca de artigos legais sobre o mencionado acima.

    []s








    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    terça-feira, 5 de janeiro de 2010 22:01
  • ola robson..

    eu tou tentando fazer a listagem de  nomes de uma tabela em mysql numa combobox em C#, e depois de conseguir seleccionar o nome pretendido gostaria de apagar da base de dados.

    O código apresentado anteriormente dá para apresentar a listagem numa combobox? Onde é que o código apresentado é inserido? é colocado dentro da função

    void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
            {
               
               
            }

    abraço
    quinta-feira, 21 de janeiro de 2010 00:46
  • luzinhas,

    Faça o seguinte teste... coloque dois botões e um combobox na sua tela. O primeiro botão é para listar todos os nomes que estão no seu banco de dados, o segundo é para excluir!

    No evento click de cada botão adicione o código
    Esse código é para exibir os dados no combobox:


                //Cria conexão com banco de dados
                using (SqlConnection CN = new SqlConnection("STRING DE CONEXAO"))
                {
                    //Cria um dataadapter para receber o select do banco de dados
                    using(SqlDataAdapter da = new SqlDataAdapter("Select Codigo, Nome from TABELA", CN))
                    {
                        //cria um datatable
                        DataTable dt = new DataTable();
                        //Faz um fill dos dados do DataAdapter para o DataTable
                        da.Fill(dt);
                        //Fonte de dados do Combobox recebe o datatable
                        this.comboBox1.DataSource = dt;
                        //DisplayMember = recebe o nome que está no banco de dados
                        this.comboBox1.DisplayMember = "Nome";
                        //ValueMember = recebe o código e guarda internamente em cada item do combobox.
                        this.comboBox1.ValueMember = "Codigo";
                    }
                }


    Esse código é para Excluir o registro no banco de dados


                //Cria conexão com banco de dados
                using (SqlConnection CN = new SqlConnection("STRING DE CONEXAO"))
                {
                    //Cria um Command para executar o Delete
                    using (SqlCommand cmd = new SqlCommand("Delete from TABELA where Codigo = @Codigo", CN))
                    {
                        //Adiciona um para @Codigo para excluir o item
                        cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = Convert.ToInt32(this.comboBox1.SelectedValue);
                        //Abre a conexão com o banco de dados
                        CN.Open();
                        //Executa no banco de dados
                        cmd.ExecuteNonQuery();
                        //Fecha a conexão com banco de dados
                        CN.Close();
                    }
                }

    Para você fazer a exclusão quando clicar no ComboBox, você deve trabalhar com o evento click ou leave do combobox.

    Espero ter ajudado. Caso seja válido marque como Resposta!

    Henrique Tambalo
    • Sugerido como Resposta luzinhas quinta-feira, 21 de janeiro de 2010 11:30
    quinta-feira, 21 de janeiro de 2010 01:40
  • Henrique,

    desde ja agradeço pela resposta.

     O código que me apresentou não dá erro ao compilar.
    A parte de mostrar os dados funciona correctamente, mas quando vou tentar eliminar o dado selecionado dá erro nesta linha, no botão de eliminar.

    cmd.Parameters.Add("@cod_utilizador", SqlDbType.Int).Value = Convert.ToInt32(this.combutilizador.SelectedValue);

    pelo que me aprecebi tem a ver com a conversão efectuada.

    O que será o problema?

    ____________

    Luis Ribeiro
    quinta-feira, 21 de janeiro de 2010 11:34
  • dá um aviso ao compilar na mesma linha e o aviso é o seguinte:

    'MySql.Data.MySqlClient.MySqlParameterCollection.Add(string, object)' é obsoleto: 'Add(String parameterName, Object value) has been deprecated.  Use AddWithValue(String parameterName, Object value)' (CS0618)
    quinta-feira, 21 de janeiro de 2010 11:57
  • Luzinhas,

    Tem como você colocar a Exception que aparece?
    Henrique Tambalo
    quinta-feira, 21 de janeiro de 2010 16:35
  • dá um aviso ao compilar na mesma linha e o aviso é o seguinte:

    'MySql.Data.MySqlClient.MySqlParameterCollection.Add(string, object)' é obsoleto: 'Add(String parameterName, Object value) has been deprecated.  Use AddWithValue(String parameterName, Object value)' (CS0618)
    Use cmd.Parameters.AddWithValue("@cod_utilizador", (int)this.combutilizador.SelectedValue));
    quinta-feira, 21 de janeiro de 2010 16:51