Array
(
)

Sofrendo com Comboboxes

Celso Souza
   - 18 jan 2010

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 = {0}", 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

Netasper
   - 19 jan 2010

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

Celso Souza
   - 19 jan 2010

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"; }

Alfran Junior
   - 20 jan 2010

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

 

Celso Souza
   - 20 jan 2010

Olá Aufran!   agora tá funciona assim:

string strqry = string.Format(@"select ID_OBRAS, ID_CLIENTES, NOME_OBRAS from OBRAS where ID_CLIENTES = {0}", 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?

Jardel Sobrinho
   - 21 jan 2010

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 = {0}", 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.

Celso Souza
   - 22 jan 2010

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
.                    

Jardel Sobrinho
   - 22 jan 2010

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;

Celso Souza
   - 22 jan 2010

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 = {0}", 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?  
 

Netasper
   - 26 jan 2010

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.

Celso Souza
   - 26 jan 2010

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

Netasper
   - 28 jan 2010

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

Celso Souza
   - 28 jan 2010

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