none
Dados não são preenchidos pelo ComboBox RRS feed

  • Pergunta

  • Caros amigos,

    Eu estou desenvolvendo uma aplicaçãozinha teste, pra aperfeiçoar meus conhecimentos e aprender fazer algumas coisas em C#, até para poder implementar algumas delas no meu TCC. Estou tendo alguns problemas para preencher os comboBox do meu formulário de vendas. No artigo que encontrei ele pede para mudar a propriedade DisplayMember de cada um como Nome e Value Member como Codigo, acontece que quando vou alterar estas propriedades clicando na setinha, aparece somente a opção none (nenhum). Eu já tentei ir em Data Source e puxar isso de forma automática através do próprio assistente do Visual Studio, mas dá problemas de referência, aí apaguei tudo e deixei a aplicação como estava antes.

    Aliás o código que estou usando no método Load do formulário de vendas é o seguinte:

    VendasBLL obj = new VendasBLL();
    clientecomboBox.dataSource = obj.ListaDeClientes;
    produtocomboBox.dataSource = obj.ListaDeProdutos;

    ListaDeClientes e ListaDeProdutos são dois métodos que retornam valores do tipo DataTable, e que estão na minha classe VendasDAL

    Porque eu não estou conseguindo encontrar os dados para colocar nestas propriedades de cada um dos combos?

    Por favor, me ajudem a solucionar este problema
    Eu já não sei mais o que eu poderia tentar
    Aguardo uma resposta mesmo que negativa
    E desde já agradeço pela atenção

    Abraços




    Diogo Vicente
    terça-feira, 14 de julho de 2009 19:58

Respostas

  • Diogo,

    Pode ser que não estejas a atribuir bem o valor "comboBox1.ValueMember", este necessita de ser uma coluna do DataTable, tal como o "Nome" o é.
    Imagina que na tua DataTable existem duas colunas, uma com o o nome "Nome" e outra com o nome "UtilizadorId", em que uma das linhas é constituida por "Diogo" na coluna "Nome" e por "156" na coluna "UtilizadorId".

    Seguindo este raciocínio {Exemplifico isto no código abaixo}, quando selecionas na comboBox1 o nome "Diogo", vai ser apresentada uma caixa de texto com o valor "156".

            private void bindCombo()
            {
                //Carrega a comboBox com um DataSet retornado pela função ObterDados()
                comboBox1.DataSource = ObterDados();
                <br/>
                //Define-se qual a coluna do DataSet a apresentar na comboBox
                comboBox1.DisplayMember = "Nome";
                
               //Define-se qual o valor a devolver quando selecionado um item
               //o valor que se atribui ao Value Member necessita de ser uma coluna da DataTable
               comboBox1.ValueMember="UtilizadorId";
            }
    
    
           private void ComboBox1_SelectedIndexChanged(object sender,System.EventArgs e)
           {
                //guarda na string o valor do item selecionado
                string resultadoSelecionado = comboBox1.SelectedItem.ToString();
               
                //apresenta uma caixa de texto com o resultado
                messageBox.Show(resultadoSelecionado);
           }

    Cumprimentos

    Bruno Pires - www.blastersystems.com/blog
    quarta-feira, 15 de julho de 2009 20:36
  • Diogo,


    O tipo de comboBox1.ValueMember="378" é  String e o tipo de comboBox1.SelectedValue é do tipo Object.
    Assim, para obteres o valor da comboBox1.SelectedValue, tens que o transformar do tipo Object para o tipo que necessitas.


    Exemplo - [ Testei isso :) ]
            //Esta é uma função que devolove uma DataTable para testar a comboBox
            private DataTable  ObterDados()
            {
                //Cria uma DataTable com o nome Teste
                DataTable dt = new DataTable("Teste");
    
                //Adiociona uma coluna à DataTable com o nome "Nome"
                dt.Columns.Add("Nome");
                //Adiociona uma coluna à DataTable com o nome "ID"
                dt.Columns.Add("ID");
    
                //Cria um nova linha de informação para a DataTable
                DataRow dr=dt.NewRow() ;
                dr.ItemArray = new object[] {"Cliente1","285"};
                //Adiciona a linha à DataTable com o Nome = Cliente1 e ID = 285 
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr.ItemArray = new object[] { "Cliente2", "289" };
                //Adiciona a linha à DataTable com o Nome = Cliente2 e ID = 289
                dt.Rows.Add(dr);
    
                //Devolve a DataTable
                return dt;
            }
    
    
            private void bindCombo()
            {
                //Adiciona uma fonte de informação à comboBox1
                comboBox1.DataSource = ObterDados();
    
                //Define-se qual a coluna do DataSet a apresentar na comboBox
                comboBox1.DisplayMember = "Nome";
    
                //Define-se qual o valor a devolver quando selecionado um item
                //o valor que se atribui ao Value Member necessita de ser uma coluna da DataTable
                comboBox1.ValueMember = "ID";
            }
    
            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                //Faz-se o Cast do tipo Object para o tipo ComboBox
                ComboBox c = (ComboBox)sender ;
                
                //apresenta uma caixa de texto com ValueMember do item selecionado na comboBox1
                MessageBox.Show(c.SelectedValue.ToString());
            }

    Bruno Pires - www.blastersystems.com/blog
    quinta-feira, 16 de julho de 2009 09:34

Todas as Respostas

  • Diogo,

    Pelo que estou estou a compreender, o teu problema é que depois de adicionares ao datasource a informação, ela não é apresentada.

    Quando queres adicionar informação nesse formato a controlos desse tipo, como gridviews, listviews ou comboBox, depois de lhe indicares qual o repositório de dados, necessitas de executar uma função para o controlo carregar o conteúdo do repositório, ou seja:


    //Crias o objecto que contem dos dados
    VendasBLL obj = new VendasBLL();

    //indicas aos controlos qual p repositório de dados
    clientecomboBox.dataSource = obj.ListaDeClientes;
    produtocomboBox.dataSource = obj.ListaDeProdutos;


    //Agora executas o carregamento dos dados
    clientecomboBox.DataBind();
    produtocomboBox.DataBind();


    Cumprimentos,

    Bruno

    Bruno Pires www.blastersystems.com www.blastersystems.com/blog
    • Sugerido como Resposta Bruno AC Pires quarta-feira, 15 de julho de 2009 09:35
    quarta-feira, 15 de julho de 2009 09:33
  • Cara, eu tentei fazer a chamada para o DataBind, mas no Visual Studio 2008 está como DataBinding eu axo, só que mesmo assim não está funcionando, aliás ele dá uns erros no momento da compilação

    De qualquer forma eu agradeço pela resposta, valeu pela intenção de querer me ajudar ;)

    um grande abraço
    Diogo Vicente
    quarta-feira, 15 de julho de 2009 15:36
  • Diogo,

    Vamos tentar resolver o seu problema então. Penso que eu compreendi mal o seu problema.

    Como tu estas a utilizar uma DataTable, depois de indicares o repositório de dados, que neste caso é uma DataTable, necessitas indicar qual o nome da coluna da DataTable que queres apresentar na ComboBox, pois uma DataTable pode conter várias colunas.

    Exemplo:

            private void bindCombo()
            {
                //Carrega a comboBox com um DataSet retornado pela função ObterDados()
                comboBox1.DataSource = ObterDados();
                
    //Define-se qual a coluna do DataSet a apresentar na comboBox comboBox1.DisplayMember = "Nome"; //Define-se qual o valor a devolver quando selecionado um item comboBox1.ValueMember="utilizadorId"; }

    Cumprimentos

    Bruno Pires - www.blastersystems.com/blog
    quarta-feira, 15 de julho de 2009 16:02
  • Rapaz tentei colocar aqui do jeito que você tá falando, e realmente agora está aparecendo no combo como deve ser. Problema é que agora quando vou realizar a venda, gera uma exceção...ArgumentException por causa da propriedade valuemember do produtocomboBox =(


    Diogo Vicente
    quarta-feira, 15 de julho de 2009 18:26
  • Diogo,

    Pode ser que não estejas a atribuir bem o valor "comboBox1.ValueMember", este necessita de ser uma coluna do DataTable, tal como o "Nome" o é.
    Imagina que na tua DataTable existem duas colunas, uma com o o nome "Nome" e outra com o nome "UtilizadorId", em que uma das linhas é constituida por "Diogo" na coluna "Nome" e por "156" na coluna "UtilizadorId".

    Seguindo este raciocínio {Exemplifico isto no código abaixo}, quando selecionas na comboBox1 o nome "Diogo", vai ser apresentada uma caixa de texto com o valor "156".

            private void bindCombo()
            {
                //Carrega a comboBox com um DataSet retornado pela função ObterDados()
                comboBox1.DataSource = ObterDados();
                <br/>
                //Define-se qual a coluna do DataSet a apresentar na comboBox
                comboBox1.DisplayMember = "Nome";
                
               //Define-se qual o valor a devolver quando selecionado um item
               //o valor que se atribui ao Value Member necessita de ser uma coluna da DataTable
               comboBox1.ValueMember="UtilizadorId";
            }
    
    
           private void ComboBox1_SelectedIndexChanged(object sender,System.EventArgs e)
           {
                //guarda na string o valor do item selecionado
                string resultadoSelecionado = comboBox1.SelectedItem.ToString();
               
                //apresenta uma caixa de texto com o resultado
                messageBox.Show(resultadoSelecionado);
           }

    Cumprimentos

    Bruno Pires - www.blastersystems.com/blog
    quarta-feira, 15 de julho de 2009 20:36
  • Então cara, no método que eu tenho que retorna um DataTable, faz um select com todos os campos da tabela cliente e produto, e preenche um outro objeto DataTable através de um DataAdapter, consegue compreender??

    E ae pra colocar no combo clientecomboBox e produtocomboBox respectivamente, eu tenho que fazer o seguinte: atribui pra propriedade DisplayMember Nome e pra propriedade ValueMember Codigo


    Diogo Vicente
    quinta-feira, 16 de julho de 2009 00:26
  • Diogo,

    É isso mesmo que tens que fazer.
    Para a comboBoxProduto tens que atribuir às propriedades DisplayMember e ValueMember as colunas "NomeProduto" e "CodigoProduto" e para a para a comboBoxCliente tens que atribuir às propriedades DisplayMember e ValueMember as colunas "NomeCliente" e "CodigoCliente".



    Cumprimentos
    Bruno Pires - www.blastersystems.com/blog
    quinta-feira, 16 de julho de 2009 00:35
  • Brunão eu andei lendo os comentários do pessoal na página do artigo, eles estavam tendo o mesmo problema que eu, e um deles disse que precisa colocar na propriedade valuemember dos combos da mesma maneira que está na classe modelo cliente e produto respectivamente. Então fiz o teste, mas...ele está acusando um erro assim ( na verdade uma excessão né) coloquei toda a rotina pra fazer o eu quero dentro de um bloco try-catch, ae ele tah caindo do cath e dizendo que a conversão realizada está incorreta :S

    mas seria qual conversão!? isso tá complicado descobrir, já coloquei até breakpoint pra ver se descubro o problema, mas não está funcionando

     

    Diogo Vicente
    quinta-feira, 16 de julho de 2009 04:19
  • Diogo,


    O tipo de comboBox1.ValueMember="378" é  String e o tipo de comboBox1.SelectedValue é do tipo Object.
    Assim, para obteres o valor da comboBox1.SelectedValue, tens que o transformar do tipo Object para o tipo que necessitas.


    Exemplo - [ Testei isso :) ]
            //Esta é uma função que devolove uma DataTable para testar a comboBox
            private DataTable  ObterDados()
            {
                //Cria uma DataTable com o nome Teste
                DataTable dt = new DataTable("Teste");
    
                //Adiociona uma coluna à DataTable com o nome "Nome"
                dt.Columns.Add("Nome");
                //Adiociona uma coluna à DataTable com o nome "ID"
                dt.Columns.Add("ID");
    
                //Cria um nova linha de informação para a DataTable
                DataRow dr=dt.NewRow() ;
                dr.ItemArray = new object[] {"Cliente1","285"};
                //Adiciona a linha à DataTable com o Nome = Cliente1 e ID = 285 
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr.ItemArray = new object[] { "Cliente2", "289" };
                //Adiciona a linha à DataTable com o Nome = Cliente2 e ID = 289
                dt.Rows.Add(dr);
    
                //Devolve a DataTable
                return dt;
            }
    
    
            private void bindCombo()
            {
                //Adiciona uma fonte de informação à comboBox1
                comboBox1.DataSource = ObterDados();
    
                //Define-se qual a coluna do DataSet a apresentar na comboBox
                comboBox1.DisplayMember = "Nome";
    
                //Define-se qual o valor a devolver quando selecionado um item
                //o valor que se atribui ao Value Member necessita de ser uma coluna da DataTable
                comboBox1.ValueMember = "ID";
            }
    
            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                //Faz-se o Cast do tipo Object para o tipo ComboBox
                ComboBox c = (ComboBox)sender ;
                
                //apresenta uma caixa de texto com ValueMember do item selecionado na comboBox1
                MessageBox.Show(c.SelectedValue.ToString());
            }

    Bruno Pires - www.blastersystems.com/blog
    quinta-feira, 16 de julho de 2009 09:34
  • Cara, dá uma ajudinha ae pra mim, eu tava vendo meu código e analisando o exemplo que você mandou, mas não estou conseguindo encaixar esta conversão no código do botão realizar venda. Para isto estou enviando o código que coloquei para o botão realizar venda, e assim você poder me ajudar

    try

    {

     

    VendaInformation venda = new VendaInformation();

    venda.Quantidade =

    Convert.ToInt32(quantidadetextBox.Text);

    venda.CodigoCliente = (

    int)clientecomboBox.SelectedValue;

    venda.CodigoProduto = (

    int)produtocomboBox.SelectedValue;

    venda.Data =

    DateTime.Now;

    venda.Faturado =

    false;

     

    VendasBLL obj = new VendasBLL();

    obj.Incluir(venda);

     

    MessageBox.Show("Venda realizada com sucesso!");

     

     

     

     

     

     

     

     

     

    }

     

    catch (Exception ex)

    {

     

    MessageBox.Show(ex.Message);

    }


    Diogo Vicente
    quinta-feira, 16 de julho de 2009 13:29
  • Diogo,

    Ante de executares um cast para inteiro, necessitas de dizer qual é o tipo de objecto de origem, como o produtocomboBox.SelectedValue é do tipo "Object", antes de o tentares converter para Int, necessitas de o converter para um tipo.


    Experimenta o seguinte:

    venda.CodigoCliente = int.Parse(comboBox1.SelectedValue.ToString());


    Cumprimentos

    Bruno Pires - www.blastersystems.com/blog
    sexta-feira, 17 de julho de 2009 11:11
  • Brunão tentei isso, mas continua dando problema velho...agora fala que a sequencia de valores de entrada está incorreto..qualquer coisa assim


    Diogo Vicente
    sexta-feira, 17 de julho de 2009 15:59
  • Diogo,


    Apenas estou a ver duas hipóteses para o teu problema:

    o venda.CodigoCliente não é um inteiro ou estas tentar converter para inteiro um valor que não é um inteiro.




    Cumprimentos

    Bruno Pires - www.blastersystems.com/blog
    sexta-feira, 17 de julho de 2009 16:02
  • Ele é inteiro mesmo cara, acabei de ver na minha classe modelo, mas não está dando certo como estava e nem agora...:S

    O que poderá ser??

    Diogo Vicente
    sexta-feira, 17 de julho de 2009 16:05
  • Diogo,



    Antes de executar
    venda.CodigoCliente = int.Parse(comboBox1.SelectedValue.ToString());


    Executa esse código e escreve aí o resultado:
    MessageBox.Show(comboBox1.SelectedValue.ToString());

    Bruno Pires - www.blastersystems.com/blog
    sexta-feira, 17 de julho de 2009 16:50
  • Olá Diogo,

    Você pode, por favor, enviar o código completo dos métodos ListaDeClientes e ListaDeProdutos e, principalmente, dizer exatamente onde está ocorrendo o erro, e qual é a mensagem de erro que aparece (completa)?

    Na sua primeira mensagem deste tópico, dá a impressão que trata-se apenas de um problema na consulta ao banco de dados... Provavelmente algum filtro na cláusula Where que está descartando os registros da tabela, ou ainda, a tabela pode estar mesmo vazia.

    Abraços,
    Caio Proiete



    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    quinta-feira, 23 de julho de 2009 01:54
    Moderador