Sofrendo com Comboboxes
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
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
Curtidas 0
Respostas
Netasper
18/01/2010
Muda o evento AutoPostBack do controle que quer que de o post, no seu caso, é o primeiro combo.
GOSTEI 0
Celso Souza
18/01/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";
}
GOSTEI 0
Alfran Junior
18/01/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
GOSTEI 0
Celso Souza
18/01/2010
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?
GOSTEI 0
Jardel Sobrinho
18/01/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 = ", 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.
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.
GOSTEI 0
Celso Souza
18/01/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
.
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
.
GOSTEI 0
Jardel Sobrinho
18/01/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;
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;
GOSTEI 0
Celso Souza
18/01/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 = ", 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?
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?
GOSTEI 0
Netasper
18/01/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.
Caso ainda de erro, crie um SqlParameter, no caso não seja Sql, pis esta usando outro banco.
GOSTEI 0
Celso Souza
18/01/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" "
"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" "
GOSTEI 0
Netasper
18/01/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
GOSTEI 0
Celso Souza
18/01/2010
Vou lá ver e retorno com a resposta.
Obrigado.
GOSTEI 0