Usuário com melhor resposta
Dados não são preenchidos pelo ComboBox

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
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- Sugerido como Resposta Bruno AC Pires quinta-feira, 16 de julho de 2009 00:36
- Marcado como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 11 de agosto de 2009 16:59
-
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- Sugerido como Resposta Bruno AC Pires segunda-feira, 20 de julho de 2009 11:16
- Marcado como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 11 de agosto de 2009 16:55
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
-
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 -
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 -
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 -
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- Sugerido como Resposta Bruno AC Pires quinta-feira, 16 de julho de 2009 00:36
- Marcado como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 11 de agosto de 2009 16:59
-
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 -
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 -
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 -
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- Sugerido como Resposta Bruno AC Pires segunda-feira, 20 de julho de 2009 11:16
- Marcado como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 11 de agosto de 2009 16:55
-
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 -
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 -
-
-
-
Diogo,
Antes de executarvenda.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- Editado Bruno AC Pires 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
http://www.caioproiete.com