none
Na mudança do Combobox RRS feed

  • Pergunta

  • Olá,

    O que preciso é o seguinte: O usuário pode digitar o código do produto em uma text box ou seleciona-lo em uma combobox. Se ele digitar o código, a combobox mostra o nome do produto. Se ele selecionar o produto, o código aparece na text box e tb preciso exibir outros valores em labels. Consegui fazer no clique de um botão, porém preciso que o código ocorra quando mudar o valor da combobox

    O código está no método SelectedIndexChanged da combobox:

    private void cbProdutos_SelectedIndexChanged(object sender, EventArgs e)
            {
                //Auto Complete: http://www.macoratti.net/11/01/c_cbo1.htm
                string codigo = cbProdutos.SelectedValue.ToString();//Pego o código da combobox
                tbPro_cod.Text = codigo;//Mostro na text box
                Produto p = new Produto();//Instancio a classe que tem os metodos do produto
                p = p.listarProdutoPorCodigo(Convert.ToInt32(codigo));//Busco o método que lista o produto pelo código e passo o código da combobox
                lbEstoque.Visible = true;//Mostro a label, apenas um rótulo
                lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
                lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
                lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
                lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
                lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo
            }

    Tenho tb o seguinte código, mas da o erro comentado abaixo:

    private void tbPro_cod_TextChanged(object sender, EventArgs e)
            {
                Produto p = new Produto();
                int pro_cod = 0, maior_cod;
    
                if (tbPro_cod.Text != "")
                {
                    pro_cod = Convert.ToInt32(tbPro_cod.Text);//Erro: Cadeia de entrada não estava em um formato incorreto.
                    p = p.listarUltimoProduto();
                    var pro = p.listarProdutoPorCodigo(pro_cod);
                    if (pro != null)
                    {
                        if (pro.Pro_cod > 0)
                        {
                            int codigo = Convert.ToInt32(pro.Pro_cod);
                            if (pro_cod == codigo)
                            {
                                maior_cod = p.Pro_cod;
                                if (pro_cod <= maior_cod)
                                {
                                    cbProdutos.SelectedValue = pro_cod;
                                    
                                }
                                else
                                {
                                    MessageBox.Show("Produto inexistente");
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Produto inexistente");
                    }
    
                }
                else
                {
                    cbProdutos.Text = "";
                }
            


    Edinho

    segunda-feira, 20 de outubro de 2014 17:22

Respostas

  • Olá Edinhorod,

    Eu tive que fazer algo parecido com o que você esta dizendo, só que no meu caso foi Código do banco e nome do banco.

    Segue o código com mais detalhes para você.

    <!-- Textbox para inserir o código e nele já adiciono um js para obrigar o usuário a digitar somente números. -->
    <asp:TextBox ID="txtCod" runat="server" Columns="2"  OnTextChanged="txtCod_TextChanged" AutoPostBack="True" onkeypress="return fixedlength(this, event, 3);" />
    
    <!-- a drop, no seu caso será produtos -->
    <asp:DropDownList ID="ddlProd" runat="server" Width="340px" OnSelectedIndexChanged="ddlProd_SelectedIndexChanged" AutoPostBack="True" />
    
    <!-- Js caso seu código seja somente números -->
    <script type="text/javascript">
            function fixedlength(textboxID, keyEvent, maxlength) {
                //Valida numeros
                if (textboxID.value.length > maxlength) {
                    textboxID.value = textboxID.value.substr(0, maxlength);
                }
                else if (textboxID.value.length < maxlength || textboxID.value.length == maxlength) {
                    textboxID.value = textboxID.value.replace(/[^\d]+/g, '');
                    return true;
                }
                else
                    return false;
            }
    </script>

    Agora vamos ao CodeBehind com os eventos.

    /// <summary>
    /// Pesquisa o produto pelo código
    /// </summary>
    protected void txtCod_TextChanged(object sender, EventArgs e)
    {
    	try
    	{
    		 lstItem = this.ddlProd.Items.FindByValue(this.txtBanco.Text);
    		 if (lstItem != null)
    		 {
    			this.ddlProd.SelectedValue = lstItem.Value;
    		 }
    		 else
    		 {
    			this.txtCod.Text = string.Empty;
    			this.ddlProd.SelectedIndex = 0;
    			throw new Exception("Produto não encontrado");
    		}
    	}
    	catch (Exception ex)
    	{
    		// mensagem do erro para o usuário
    }
    
    /// <summary>
    /// Seleciona o produto
    /// </summary>
    protected void ddlProd_SelectedIndexChanged(object sender, EventArgs e)
    {
    	if (this.ddlProd.SelectedValue.Equals("-1"))
    	{
    		this.txtCod.Text = string.Empty;
    	}
    	else
    	{
    		this.txtCod.Text = this.ddlProd.SelectedValue;
    	}
    }


    Creio que seria mais ou menos isto que você precisa.

    Agora quento ao seus label's, é só alterá-los nos eventos. OK.

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    terça-feira, 21 de outubro de 2014 12:33
  • Opa desculpe cara, agora que vi que era windows form.

    Então a logica seria a mesma, mas para o evento do textbox seria o "Leave".

    /// <summary>
    /// Seleciona o produto
    /// </summary>
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	if (this.comboBox1.SelectedValue.Equals("-1"))
    	{
    		this.textBox1.Text = string.Empty;
    	}
    	else
    	{
    		this.textBox1.Text = this.comboBox1.SelectedValue.ToString();
    	}
    }
    
    /// <summary>
    /// Pesquisa o produto pelo código
    /// </summary>
    private void textBox1_Leave(object sender, EventArgs e)
    {
    	try
    	{
    		bool existsValue = false;
    		foreach (SeuObjetoPopulado item in this.comboBox1.Items)
    		{
    			if (item.SeuCampoID.ToString().Equals(this.textBox1.Text.Trim()))
    			{
    				this.comboBox1.SelectedItem = item;
    				existsValue = true;
    				break;
    			}
    		}
    
    		if (!existsValue)
    		{
    			this.comboBox1.SelectedIndex = 0;
    			this.textBox1.Text = string.Empty;
    			throw new Exception("Produto não encontrado");
    		}
    	}
    	catch (Exception ex)
    	{
    		MessageBox.Show(ex.Message, "Mensagem", MessageBoxButtons.OK);
    	}
    }

    Pronto estes 2 métodos já fazem a alternância entre o código do text box e o selecionado. E para seu lable, é só adicionar nos métodos. espero que ajude.

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    terça-feira, 21 de outubro de 2014 13:07

Todas as Respostas

  • Provavelmente o código do seu produto não esta no formato correto(int)...
    segunda-feira, 20 de outubro de 2014 18:19
  • Boa tarde,

    Não entendi a sua dúvida. Está gerando algum erro, a rotina não está sendo executada?

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    segunda-feira, 20 de outubro de 2014 19:33
  • Vou explicar melhor:

    Tenho uma text box para digitar o código do produto;

    Tenho uma combobox que mostra os produtos (dados vindo do BD) e labels para mostrar o estoque e o preço de venda.

    Oq eu qr fazer é qd o usuário digitar o código na text box, o nome apareça na combobox e as labels mostrem os dados. Até aí td bem, consegui fazer no evento text changed da text box. Segue o código abaixo:

    private void tbPro_cod_TextChanged(object sender, EventArgs e)
            {
                Produto p = new Produto();
                int pro_cod = 0, maior_cod;
    
                if (tbPro_cod.Text != "")
                {
                    pro_cod = Convert.ToInt32(tbPro_cod.Text);
                    p = p.listarUltimoProduto();
                    var pro = p.listarProdutoPorCodigo(pro_cod);
                    if (pro != null)
                    {
                        if (pro.Pro_cod > 0)
                        {
                            int codigo = Convert.ToInt32(pro.Pro_cod);
                            if (pro_cod == codigo)
                            {
                                maior_cod = p.Pro_cod;
                                if (pro_cod <= maior_cod)
                                {
                                    cbProdutos.SelectedValue = pro_cod;
                                    
                                }
                                else
                                {
                                    MessageBox.Show("Produto inexistente");
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Produto inexistente");
                    }
    
                }
                else
                {
                    cbProdutos.Text = "";
                }
            }

    Agora preciso fazer o contrário tb. Qd o usuário selecionar um produto na combobox, o código desse produto deve aparecer na text box. Fiz o código usando o evento selected index changed da combobox:

    string codigo = cbProdutos.SelectedValue.ToString();//Pego o código da combobox
                tbPro_cod.Text = codigo;//Mostro na text box
                Produto p = new Produto();//Instancio a classe que tem os metodos do produto
                p = p.listarProdutoPorCodigo(Convert.ToInt32(codigo));//Busco o método que lista o produto pelo código e passo o código da combobox
                lbEstoque.Visible = true;//Mostro a label, apenas um rótulo
                lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
                lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
                lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
                lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
                lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo

    Qd faço o evento acima em um click de bt ele funciona, mas no evento selected index changed da combobox ela da o seguinte erro (no evento text changed da text box) na no load do form:

    pro_cod = Convert.ToInt32(tbPro_cod.Text);//Cadeia de entrada não estava em um formato incorreto


    Edinho

    terça-feira, 21 de outubro de 2014 10:14
  • Cara, acho que entendi o que está pegando com o seu código.

    Ao selecionar o combombox, segundo o que você mesmo escreveu no último post, no evento index changed da sua combobox

    string codigo = cbProdutos.SelectedValue.ToString();//Pego o código da combobox
                tbPro_cod.Text = codigo;//Mostro na text box

    Você está jogando para o textbox, não é código do produto, voce está jogando pro textbox, o texto selecionado (o produto que o cara selecionou). E isto, dispara o evento TextChanged do seu textbox, que está esperando um inteiro no seu textbox, gerando este erro.

    Então, o que você tem que fazer é, 

    //Pego o código da combobox
    string codigo = cbProdutos.SelectedValue.ToString();
    //Mostro na text box (ERRADO, voce está pegando é o NOME do produto)
    tbPro_cod.Text = codigo;
    //Instancio a classe que tem os metodos do produto
    Produto p = new Produto();
    //Busco o método que lista o produto pelo código e passo o código da combobox
    // faça um método que busque o produto pelo NOME
    p = p.listarProdutoPorCodigo(Convert.ToInt32(codigo));
    //(seu objeto PRODUTO.(VARIAVEL_CODIGO)
    tbPro_cod.Text = p.codigo; 
    //Mostro a label, apenas um rótulo
    lbEstoque.Visible = true;
    lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
    lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
    lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo


    terça-feira, 21 de outubro de 2014 11:10
  • Valeu Vinicius por responder. Mas me diga uma coisa: Pra pegar o valor do combobox não é o SelectedValue??

    No load do meu form eu fiz assim para preencher o combobox:

    Produto p = new Produto();
    cbProdutos.DataSource = p.listarTodosProdutos();
    cbProdutos.ValueMember = "pro_cod";
    cbProdutos.DisplayMember = "pro_nome";
    cbProdutos.Refresh();
    cbProdutos.SelectedValue = -1;

    Agora no evento SelectedIndexChanged do combobox eu queria pegar o código do produto (o valueMember acima), por isso usei o SelectedValue.

    Alterei o código como abaixo, mas da o msm erro na primeira linha (Cadeia de entrada não estava em um formato incorreto):

    int codigo = int.Parse(cbProdutos.SelectedValue.ToString());//Pego o código da combobox
    Produto p = new Produto();//Instancio a classe que tem os metodos do produto
    p = p.listarProdutoPorCodigo(Convert.ToInt32(codigo));//Busco o método que lista o produto pelo código e passo o código da combobox
    tbPro_cod.Text = p.Pro_cod.ToString();
    lbEstoque.Visible = true;//Mostro a label, apenas um rótulo
    lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
    lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
    lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo


    Edinho

    terça-feira, 21 de outubro de 2014 11:24
  • Bom, geralmente eu uso o método SelectedItem, mas ela só vale caso o usuário selecione algo no combobox. Se ele digitar, não irá pegar e dará uma exceção.

    Mas voce pode dar um MessageBox.Show(cbProdutos.SelectedValue.ToString()); pra ver o que ele está te retornando.

    Entretanto, no combobox, nas imagens que postou anteriormente, não vi o codigo no combobox, mas sim, apenas o nome do produto. 

    Como pretende pegar o código do produto se na lista do combobox só tem o nome dele, entendeu?

    E nesse código que postou, não fez as alterações que te falei, voce está convertendo pra int o texto da combobox (que na minha opiniao, estão vindo o nome do produto).

    Então, faça o seguinte:

    //Pego o nome do produto na combobox
    string nomeProduto = cbProdutos.SelectedValue.ToString();
    Produto p = new Produto();//Instancio a classe que tem os metodos do produto
    //Busco o método que lista o produto pelo nome
    p = p.listarProdutoPorNome(nomeProduto);
    tbPro_cod.Text = p.Pro_cod.ToString();
    lbEstoque.Visible = true;//Mostro a label, apenas um rótulo
    lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
    lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
    lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo

    Obs: A segunda linha em negrito, voce terá que criar um método pra buscar o codigo do produto pelo nome dele, e não buscar o produto pelo código, neste caso da seleção do combobox.

    terça-feira, 21 de outubro de 2014 11:37
  • Vinicius, eu fiz o MessageBox e realmente ele está retornando o código do produto (fiz o teste num botão).

    Oq não entendo é pq qd eu uso o seguinte código no botão ele funciona da maneira que eu qr (quer dizer que minha lógica tá certa, né?) mas eu queria q ocorresse ao mudar o item do combobox (Seria mesmo o evento SelectedIndexChanged?):

    int codigo = int.Parse(cbProdutos.SelectedValue.ToString());//Pego o código da combobox
    Produto p = new Produto();//Instancio a classe que tem os metodos do produto
    p = p.listarProdutoPorCodigo(Convert.ToInt32(codigo));//Busco o método que lista o produto pelo código e passo o código da combobox
    tbPro_cod.Text = p.Pro_cod.ToString();
    lbEstoque.Visible = true;//Mostro a label, apenas um rótulo
    lbValorUnit.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_est.Text = p.Estoque_qtde.ToString();//Mostro a label com o estoque do produto
    lbPro_est.Visible = true;//Mostro a label, apenas um rótulo
    lbPro_valor.Text = p.Pro_precovenda.ToString();//Mostro a label com o preço do produto
    lbPro_valor.Visible = true;//Mostro a label, apenas um rótulo
    PS. Fiz do jeito que vc falou acima e tb deu o mesmo erro.


    Edinho

    terça-feira, 21 de outubro de 2014 11:51
  • Olá Edinhorod,

    Eu tive que fazer algo parecido com o que você esta dizendo, só que no meu caso foi Código do banco e nome do banco.

    Segue o código com mais detalhes para você.

    <!-- Textbox para inserir o código e nele já adiciono um js para obrigar o usuário a digitar somente números. -->
    <asp:TextBox ID="txtCod" runat="server" Columns="2"  OnTextChanged="txtCod_TextChanged" AutoPostBack="True" onkeypress="return fixedlength(this, event, 3);" />
    
    <!-- a drop, no seu caso será produtos -->
    <asp:DropDownList ID="ddlProd" runat="server" Width="340px" OnSelectedIndexChanged="ddlProd_SelectedIndexChanged" AutoPostBack="True" />
    
    <!-- Js caso seu código seja somente números -->
    <script type="text/javascript">
            function fixedlength(textboxID, keyEvent, maxlength) {
                //Valida numeros
                if (textboxID.value.length > maxlength) {
                    textboxID.value = textboxID.value.substr(0, maxlength);
                }
                else if (textboxID.value.length < maxlength || textboxID.value.length == maxlength) {
                    textboxID.value = textboxID.value.replace(/[^\d]+/g, '');
                    return true;
                }
                else
                    return false;
            }
    </script>

    Agora vamos ao CodeBehind com os eventos.

    /// <summary>
    /// Pesquisa o produto pelo código
    /// </summary>
    protected void txtCod_TextChanged(object sender, EventArgs e)
    {
    	try
    	{
    		 lstItem = this.ddlProd.Items.FindByValue(this.txtBanco.Text);
    		 if (lstItem != null)
    		 {
    			this.ddlProd.SelectedValue = lstItem.Value;
    		 }
    		 else
    		 {
    			this.txtCod.Text = string.Empty;
    			this.ddlProd.SelectedIndex = 0;
    			throw new Exception("Produto não encontrado");
    		}
    	}
    	catch (Exception ex)
    	{
    		// mensagem do erro para o usuário
    }
    
    /// <summary>
    /// Seleciona o produto
    /// </summary>
    protected void ddlProd_SelectedIndexChanged(object sender, EventArgs e)
    {
    	if (this.ddlProd.SelectedValue.Equals("-1"))
    	{
    		this.txtCod.Text = string.Empty;
    	}
    	else
    	{
    		this.txtCod.Text = this.ddlProd.SelectedValue;
    	}
    }


    Creio que seria mais ou menos isto que você precisa.

    Agora quento ao seus label's, é só alterá-los nos eventos. OK.

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    terça-feira, 21 de outubro de 2014 12:33
  • Opa desculpe cara, agora que vi que era windows form.

    Então a logica seria a mesma, mas para o evento do textbox seria o "Leave".

    /// <summary>
    /// Seleciona o produto
    /// </summary>
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	if (this.comboBox1.SelectedValue.Equals("-1"))
    	{
    		this.textBox1.Text = string.Empty;
    	}
    	else
    	{
    		this.textBox1.Text = this.comboBox1.SelectedValue.ToString();
    	}
    }
    
    /// <summary>
    /// Pesquisa o produto pelo código
    /// </summary>
    private void textBox1_Leave(object sender, EventArgs e)
    {
    	try
    	{
    		bool existsValue = false;
    		foreach (SeuObjetoPopulado item in this.comboBox1.Items)
    		{
    			if (item.SeuCampoID.ToString().Equals(this.textBox1.Text.Trim()))
    			{
    				this.comboBox1.SelectedItem = item;
    				existsValue = true;
    				break;
    			}
    		}
    
    		if (!existsValue)
    		{
    			this.comboBox1.SelectedIndex = 0;
    			this.textBox1.Text = string.Empty;
    			throw new Exception("Produto não encontrado");
    		}
    	}
    	catch (Exception ex)
    	{
    		MessageBox.Show(ex.Message, "Mensagem", MessageBoxButtons.OK);
    	}
    }

    Pronto estes 2 métodos já fazem a alternância entre o código do text box e o selecionado. E para seu lable, é só adicionar nos métodos. espero que ajude.

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    terça-feira, 21 de outubro de 2014 13:07
  • Olá Demetrius, obrigado por responder e desculpa a demora, é que como fiquei enrolado nesse item, resolvi mexer em outras coisas.

    A unica coisa que não entendi é uma parte do código dentro do if:

    if (item.SeuCampoID.ToString().Equals(this.textBox1.Text.Trim()))

    Esse SeuCampoID eu pego de onde? Tenho que chamar o método que traz os dados do produto por código?


    Edinho

    quinta-feira, 23 de outubro de 2014 11:04
  • Olá, o item SeuCampoID, é a propriedade do seu objeto que você populou sua combo. Que no seu caso acho que seria o Produto.Codigo 
    quinta-feira, 23 de outubro de 2014 12:50