Sofrendo com Comboboxes

18/01/2010

0

Boa Noite!

Tenho 2 combobox, que são preenchidas com os dados de duas tabelas, que estão vinculadas pelo ID-CLIENTES, ao iniciar o form da seguinte maneira:

public frmLocacaoEquip() { InitializeComponent(); cbxClientes.DataSource = preencheClientes().Tables[0]; cbxClientes.DisplayMember = "nome_clientes"; cbxClientes.ValueMember = "id_clientes"; cbxObras.DataSource = preencheObras().Tables[0]; cbxObras.DisplayMember = "NOME_OBRAS"; cbxObras.ValueMember = "id_obras"; } private DataSet preencheClientes() { DataSet ds = new DataSet(); conFB = new ConexaoFB(strConexao); conFB.iniciaDataAdpter("select ID_CLIENTES, NOME_CLIENTES from CLIENTES order by NOME_CLIENTES"); conFB.FbDA.Fill(ds, "CLIENTES"); conFB.fecharConexao(); return ds; } private DataSet preencheObras() { DataSet ds = new DataSet(); conFB = new ConexaoFB(strConexao); conFB.iniciaDataAdpter("SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS order by NOME_OBRAS"); conFB.FbDA.Fill(ds, "OBRAS"); conFB.fecharConexao(); return ds; } Estou tentando a bastante tempo fazer com que ao selecionar um cliente na primeira combobox a segunda seja carregada com todas as obras daquele cliente, já fiz em visual basic no século passado, mas na moderna C# ta difícil.

Minha última tentativa também não resultou em nada usei este código no SelectedIndexChanged:
private void cbxClientes_SelectedIndexChanged(object sender, EventArgs e) { string strqry = string.Format(@"SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = ", cbxClientes.Text); DataTable dt = new DataTable(); conFB = new ConexaoFB(strConexao); conFB.iniciaDataAdpter(strqry); conFB.FbDA.Fill(dt); cbxClientes.Items.Clear(); foreach (DataRow dr in dt.Rows) { cbxObras.Items.Add(dr[0].ToString()); } } Se alguem puder me dar uma luz, eu fico muito agradecido.

Abraços
Celso Souza

Celso Souza

Responder

Posts

19/01/2010

Netasper

Muda o evento AutoPostBack do controle que quer que de o post, no seu caso, é o primeiro combo.
Responder

19/01/2010

Celso Souza

Alterei o código conforme abaixo, o Form agora abre sem dar erro, mas quando eu selecionoum cliente na primeria combo, a segunda é carregada com todas as obras, mas não é isso que quero, preciso filtrar as obras por cliente. private void cbxClientes_SelectedIndexChanged(object sender, EventArgs e) { DataTable dt = new DataTable(); conFB = new ConexaoFB(strConexao); string strqry = string.Format(@"SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = ID_CLIENTES", cbxClientes.SelectedValue); conFB.iniciaDataAdpter(strqry); conFB.FbDA.Fill(dt); cbxObras.DataSource = dt; cbxObras.DisplayMember = "NOME_OBRAS"; cbxObras.ValueMember = "ID_CLIENTES"; }
Responder

20/01/2010

Alfran Junior

Bom dia, Eu acho que o seu problema de esta trazendo todas as obras está na sua consulta. Voce tem que passar como parametro pra essa consulta o id do cliente para que seja filtrada as obras do mesmo. Pode ser utilizado dessa forma via concatenação de String na consulta que nao seria a mais indicada. strqry = string.Format(@"SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = " + cbxClientes.SelectedValue); Ou por adição de Parameters dessa sua classe de acesso a dados. Espero ter ajudado abs  
Responder

20/01/2010

Celso Souza

Olá Aufran!   agora tá funciona assim: string strqry = string.Format(@"select ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS where ID_CLIENTES = ", cbxClientes.SelectedValue); Mas quando vou debugar a aplicação dá um erro do Firebird onde diz que na linha 1 coluna 86 tem um token desconhecido, que ele diz que é um .(ponto), só que neste local da linha só existe o espaço entre a cláusula where e o fild Id_clientes, eu testei o select direto no IBExpert e não ocorreu erro, retornou o resultado do select perfeito.   Quanto eu abro a aplicação direto pelo aquivo executável este erro não ocorre, voce já viu alguma coisa assim?
Responder

21/01/2010

Jardel Sobrinho

Ola Celso

Acho que o seu problema está nessa linha:

string strqry = string.Format(@"SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = ", cbxClientes.Text);
Se você usar a propriedade Text ele vai te mostrar o nome do cliente, se você a propriedade SelectedValue ele vai mostrar o codigo do Cliente, pois você configou a propriedade ValueMember como o campo id_clientes.O sql gerado está errado. Depois do campo Where você especifica o campo de consulta, no seu caso o campo id_clientes. Se esse campo for numerico o valor passado na consulta não precisa de aspas simples, mas se for de texto tem que haver aspas entre o valor passado. Na pratica fica assim.Se o id_clientes for um campo Numerico:string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = " + cbxClientes.Text;
Se o id_clientes for um campo de Texto:
string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = '" + cbxClientes.Text + "'";Note as aspas simples entre ficaram no valor passado ao id_clientes.Espero ter ajudado.




Responder

22/01/2010

Celso Souza

Ola Jardel!   Usei a linha como voce propos: string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = " + cbxClientes.Text;   Mas continua dando o erro quando eu abro o formulário:
An exception of type 'FirebirdSql.Data.FirebirdClient.FbException' occurred in FirebirdSql.Data.FirebirdClient.dll but was not handled in user code Additional information: Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 84
.                    
Responder

22/01/2010

Jardel Sobrinho

Celso

Eu te passei a propriedade do componente errado, eu utilizei a propriedade Text do cbxClientes, mas a propriedade correta é a SelectedValue. Então a linha ficara assim:

string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = " + cbxClientes.SelectedValue;


Responder

22/01/2010

Celso Souza

Das duas formas a linha de comando SQL funcionam:   string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = " + cbxClientes.SelectedValue;
string strqry = string.Format(@"select ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS where ID_CLIENTES = ", cbxClientes.SelectedValue);   Mas quando abro o form em modo de depuração da o erro, se inicio pelo executável não dá o erro, estou preocupado de no futuro dar um erro depois que entregar a aplicação, entendeu?  
 
Responder

26/01/2010

Netasper

Amigo,   Tenta usar o parametro como string, com aspas.   string strqry = "SELECT ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS WHERE ID_CLIENTES = '" + cbxClientes.SelectedValue + "'";
Caso ainda de erro, crie um SqlParameter, no caso não seja Sql, pis esta usando outro banco.
Responder

26/01/2010

Celso Souza

Olá NetAsper!     Estou usando Firebird 2.1 alterei a forma do parâmetro e o tipo de erro mudou, ele ocorre do mesmo jeito, só durante o debub, mas agora dá esse erro:

"An exception of type 'FirebirdSql.Data.FirebirdClient.FbException' occurred in FirebirdSql.Data.FirebirdClient.dll but was not handled in user code   Additional information: conversion error from string "System.Data.DataRowView" "
Responder

28/01/2010

Netasper

Amigo,   agora este problema esta me parecendo algo de imcompatibilidade de tipagem do Firebird. posta esta duvida na sala de Firebird, onde o pessoal tem o knowhow necessario em firebird para te auxiliar nesta duvida...   []s
Responder

28/01/2010

Celso Souza

Vou lá ver e retorno com a resposta.   Obrigado.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar