Como exibir valor relacionado a combobox na textbox? – c# sql-server webforms

Pergunta:


Estou fazendo um projeto em C# e SQL Server, e necessito que o item selecionado na combo exiba os valores correspondentes em uma textbox.

Segue os códigos que já tentei:

        private void preencherCBDescricao()
        {

            SqlConnection con = new SqlConnection("Data Source=FS5;Initial Catalog=bdsi01;User ID=bdsi01;Password=*****");

            try
            {
                con.Open();
            }
            catch (SqlException sqle)
            {
                MessageBox.Show("Falha ao efetuar a conexão. Erro: " + sqle);
            }
            String scom = "select titulo from Livros";
            SqlDataAdapter da = new SqlDataAdapter(scom, con);
            DataTable dtResultado = new DataTable();
            dtResultado.Clear();//o ponto mais importante (limpa a table antes de preenche-la)
            cbocompra.DataSource = null;
            da.Fill(dtResultado);
            cbocompra.DataSource = dtResultado;

            cbocompra.DisplayMember = "titulo";
            cbocompra.SelectedItem = "";
            cbocompra.Refresh(); //faz uma nova busca no BD para preencher os valores da cb de livros.


        }

        private void cbocompra_SelectedIndexChanged(object sender, EventArgs e)
        {
            string stg;
            stg = cbocompra.SelectedItem.ToString();

            SqlConnection con = new SqlConnection("Data Source=FS5;Initial Catalog=bdsi01;User ID=bdsi01;Password=*******");

            try
            {
                con.Open();
            }
            catch (SqlException sqle)
            {
                MessageBox.Show("Falha ao efetuar a conexão. Erro: " + sqle);
            }

            String scom = "select * from Livros where titulo="+ stg;


            txtautor1.Text = cbocompra.SelectedItem.ToString();
            txtedit1.Text = cbocompra.SelectedItem.ToString();
            txtpreco.Text = cbocompra.SelectedItem.ToString();

        }

A questão é, como posso guardar os valores do meu select em uma lista e após o item ser selecionado eu usar o valor desse item para procura na lista os dados correspondente como o Nome autor, preço para carregar os meus textbox com essas informações ?

Tipo criar uma lista e com ela carregar meu combobox, e quando o usuário selecionar um item eu carregar os textbox com as informações desse item.

Autor da pergunta Natalia Souza

Este processo é bastante simples.

No vosso exemplo, supondo que a tabela não tem uma chave primária (ID) que identifica os registos de forma unívoca, o controlo ComboBox terá que receber a tabela completa para fazer todo o trabalho por si, indexando cada registo (DataRow) na sua lista para ser acedido pela propriedade SelectedItem.

Ajustando o código:

    private void preencherCBDescricao()
    {

        SqlConnection con = new SqlConnection("Data Source=FS5;Initial Catalog=bdsi01;User ID=bdsi01;Password=*****");

        try
        {           
            String scom = "select * from Livros";
            SqlDataAdapter da = new SqlDataAdapter(scom, con);
            DataTable dtResultado = new DataTable();
            da.Fill(dtResultado);

            //Limita aos itens da lista pendente
            cbocompra.DropDownStyle = ComboBoxStyle.DropDownList;
            cbocompra.DataSource = null;               
            cbocompra.DataSource = dtResultado;
            cbocompra.DisplayMember = "titulo";
            cbocompra.Text = "";//pode usar o .Text = "" ou o .SelectedIndex = -1 para limpar o item seleccionado.
        }
        catch (SqlException sqle)
        {
            MessageBox.Show("Falha ao efectuar a conexão. Erro: " + sqle);   
        }
    }

A seguir, no evento SelectedIndexChanged, não será necessário nova busca a base de dados. Os dados já estão no DataSouce da ComboBox. Para obter a linha seleccionada, usamos apenas a propriedade SelectedItem que é do tipo DataRowView. Com este objecto, podemos aceder cada célula da linha seleccionada, indicando o nome ou o índice da coluna:

    private void cbocompra_SelectedIndexChanged(object sender, EventArgs e)
    {            
        //verifica se foi seleccionado um item na lista
        if (cbocompra.SelectedIndex != -1)
        {

             //Podemos obter o linha seleccionada com a propriedade SeletedItem                 
             DataRowView drw = ((DataRowView)cbocompra.SelectedItem);
             txtautor1.Text =  drw["titulo"].ToString();
             txtedit1.Text =  drw["editora"].ToString();
             txtpreco.Text =  drw["preco"].ToString();
         }
         else
         {
             txtautor1.Text = "";
             txtedit1.Text = "";
             txtpreco.Text = "";
         }
    }

Bom se eu entendi em uma Index da comboBox possui mais de uma informação: Autor, Edit, Preço..
Se quiser retirar esse valores você deve obter o index selecionado pelo cliente/usuário e especificar no SelectedIndex para depois usar o SelectedItem, mas como você tem 3 informações você deve obter esse valor para uma string e depois usar o foreach para separar usando o Split.

Seu código poderia ficar mas ou menos assim:

string DadosSelecionados = null;
            MyCombo.SelectedIndex = 0; //index que foi selecionado, EX:0
            DadosSelecionados = MyCombo.SelectedItem.ToString();

                                       //0           //1           //2
            DadosSelecionados = "O mundo Increvel, Editora Nova, R$325,50";//digamos que foram esses os dados selecionados
            string[] Dados = DadosSelecionados.Split(',');
                                           //0 1 2 << 3
            string[] MyDados = new string[3];
            int i = 0;
            foreach(string s in Dados)
            {
                MyDados[i] = s.ToString();
                i++; //mesma coisa de i+=1! não confunda com ++i;
            }

            //seta os dados no seus textbox
            TXTNome.Text = MyDados[0].ToString();
            TXTEditora.Text = MyDados[1].ToString();
            TXTpreco.Text = MyDados[2].ToString(); 

Tem erros devido a ser feito na mão mesmo.. mas você só precisa entender o conceito..
🙂

Suponho que sejam múltiplos itens, então é melhor trabalhar com uma List e para cada item criar um objeto.

Exemplo de classe para os itens:

private class Item
{
    public string Autor {get; set;}
    public string Editora {get; set;}
    public string Preco {get; set;}

    public Item(string Autor, string Editora, string Preco)
    {
        this.Autor = Autor;
        this.Editora = Editora;
        this.Preco = Preco;
    }
}

Crie a lista para os itens

List<Item> lista = new List<Item>();

Obtem-se os dados da string como o colega Vyctor Junior fez e coloca o item na lista:

string DadosSelecionados = "As Loucas Aventuras de James West, Editora Nova, R$325,50";
string[] itens = DadosSelecionados.Split(new string[] { ", "});
Item it = new Item(itens[0], itens[1], itens[2]);
lista.Add(it);

O ComboBox aceita enumerações, então basta passar a lista para a propriedade DataSource. Para ele saber o que será exibido de cada item da lista, escreve o nome da propriedade da classe ou struct Item na propriedade do ComboBox DisplayMember. Suponhamos que seja Autor:

cbocompra.DataSource = lista;
cbocompra.DisplayMember = "Autor";

No evento de quando o usuário muda o item a propriedade SelectedItem vai ter o item selecionado (em forma de object). Daí é só fazer um cast e preencher os TextBox.

Item item= (Item)cbocompra.SelectedItem;
txtautor1.Text = item.Autor;
txtedit1.Text = item.Editora;
txtpreco.Text = item.Preco;

Essa é a forma mais fácil que eu conheço pra isso.
Eu fiz a mão, então podem ter erros de sintaxe. Espero ter ajudado.

Com o visual studio isso é feito automaticamente com ajuda do ADO.NET. Basta você criar um DataSource com os campos e as tabelas desejadas, e utilizando o “clicar e arrastar” você coloca o ComboBox da tabela e os TextBox das colunas dentro do seu Form.

Observe a imagem abaixo:

Exemplo de DataSource no Visual Studio 2015

Explicando:
Quando você cria uma instância da tabela é criado um DataSet para acessar a base de dados, um TableAdapter para a interface acessar os dados e um BindingSource para selecionar as linhas.

O BindingSource que faz o controle dos dados selecionados e visíveis, ou seja, quando você selecionar um item na instância (ComboBox) que referencia a tabela, o BindingSource vai trocar todos os conteúdos das instâncias referenciadas pelas colunas (TextBox).

Lembrando que é melhor criar a referencia da tabela (ComboBox) primeiro, pois assim os TextBox vão assimilar o DataAdapter e o BindingSource automaticamente, caso contrario serão criados vários DataAdapters e BindingSources

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *