none
Atualizar combobox RRS feed

  • Pergunta

  • Pessoal estou aqui mais uma vez pedindo a ajuda de vcs.

    Estou com um problema que estou pesquisando mas não encontro solução!!

    Bem, tenho um formulário de cadastro de tarefas onde existe uma combo box com tarefas a serem selecionadas assim que a tarefa é selecionada é cadastrado no banco, até ai tudo bem, o meu problema é que eu preciso que ao clicar no cadastro no datagrid , abrira outro form com a combobox tarefas. Sendo que eu preciso que essa que abriu agora do segundo form venha com o item selecionado da anterior o que foi cadastrado e esta no datagrid.

    Tem como fazer isso?

    Desde já agradeço.


    • Editado Felipe1520 segunda-feira, 24 de julho de 2017 14:27
    segunda-feira, 24 de julho de 2017 14:22

Respostas

  • Tudo bem.

    O que quis dizer é pra você criar uma classe específica (se ainda não tem) pra representar seu conjunto de dados.
    O DataTable é uma estrutura genérica, como uma matriz (na verdade é uma matriz).

    Faça por exemplo:

    class Software {
      public int codigo;
      public string nome;
    }
    
    List<Software> lista = new List<Software>();
    
    foreach(DataRow row in dt.Rows) {
    
      Software temp = new Software();
      temp.codigo = row["codigo"];
      temp.nome = row["nome"];
      lista.Add(temp);
    
    }
    
    cbb.ValueMember = "codigo";
    cbb.DisplayMember = "nome";
    cbb.DataSource = lista;
    
    // com isto você poderá atribuir ao SelectedValue da ComboBox qualquer valor dos códigos da tua tabela

    Se você estava fazendo como neste último código que você postoue com isto aparecia corretamente os nomes dos softwares na ComboBox e você não queria/precise se preocupar com modelagem, você pode encontrar o item a selecionar apenas iterando nos itens da ComboBox, como sugeri acima.

    ATT

    • Marcado como Resposta Felipe1520 quinta-feira, 27 de julho de 2017 17:21
    quarta-feira, 26 de julho de 2017 21:18

Todas as Respostas

  • Super simples, faça uma sobrecarga de construtor do seu segundo form, informando o item ou indicie do item que deve estar selecionado na combobox do segundo form:

    public Form2(int cbxSelectedIndex)
    {
        InitializeComponent();
        this.combobox1.SelectedIndex = cbxSelectedIndex;
    }

    Mas ATENÇÃO! Você tem que fazer outro construtor, não retirar o construtor padrão dos forms. E em ambos os construtores, não esqueça de fazer a chamada ao método InitializeComponent(). Fazendo isso, no seu primeiro form, quando for hora de mostrar o segundo, só fazer a instancia do seu segundo form, passando o argumento, que no caso vai ser o indicie do item que deve estar selecionado na combobox do form2, e mostra-lo com o método Show() ou ShoDialog().

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2(this.comboBox1.SelectedIndex);
        frm2.ShowDialog();
    }

    Veja se te ajuda.

    • Editado Cliffinho segunda-feira, 24 de julho de 2017 16:53
    segunda-feira, 24 de julho de 2017 16:47
  • Na verdade o formulario 2 e um panel que criei dentro do form1.

    Funciona assim mesmo?

    segunda-feira, 24 de julho de 2017 17:28
  • Neste caso é ainda mais simples, basta você ter a segunda ComboBox populada com as tarefas listadas na grid e então apenas atribuir o valor da propriedade SelectedValue.

    ATT

    terça-feira, 25 de julho de 2017 11:40
  • Felipe, eu não entendi exatamente o que você fez. Quer dizer que não existe um segundo form? Olha, se for isso, então você não precisa fazer sobrecarga de construtor e instancias, basta apenas atribuir o valor selecionado de um ComboBox em outro, caso estejam no mesmo form.

    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        comboBox2.SelectedIndex = comboBox1.SelectedIndex;
    }

    Uma coisa importante que é bom ter atenção é que, ambos os códigos que te passei, o primeiro e este, funcionam bem se ambas as ComboBox tiverem os mesmos itens, especificamente, a mesma quantidade de itens. Portanto, se você por um acaso tentar atribuir um indicie fora da quantidade máxima de itens de uma das comboBox, uma exceção será lançada. Então, é melhor fazer a verificação. Vamos automatizar um pouco as coisas:

    private void ChangeSelectedItemOnComboBox(ComboBox target, int indexToSelect)
    {
        if ( (indexToSelect > -1) && (indexToSelect < target.Items.Count -1) )
        {
            target.SelectedIndex = indexToSelect;
        }
    }

    Agora basta chamar o método em um Event Handler de alguma ComboBox:

    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        ChangeSelectedItemOnComboBox(comboBox2, comBox1.SelectedIndex);
    }
    • Editado Cliffinho terça-feira, 25 de julho de 2017 13:31
    terça-feira, 25 de julho de 2017 13:28
  • Neste caso é ainda mais simples, basta você ter a segunda ComboBox populada com as tarefas listadas na grid e então apenas atribuir o valor da propriedade SelectedValue.

    ATT

    adpeiter Fiz isso no update. 

         cmd2.Parameters.Add("@fk_id_software", SqlDbType.Int).Value = cb_Atualiza_sof.SelectedValue

    Faz o update mas nao funciona quando clico novamente nao abre com o item que eu selecionei e sim com o primeira da lista da combobox

    Fiz assim para as text boxes , mas para a combo nao ta funcionando diz que o formato  esta errado

       private void dataGridView1_DoubleClick(object sender, EventArgs e)
            {
                
                string a;
                string b;
                string c;
                int selectedrowindex = dataGridView1.SelectedCells[1].RowIndex;
                int selectedrowindex1 = dataGridView1.SelectedCells[3].RowIndex;
                int selectedrowindex2 = dataGridView1.SelectedCells[2].RowIndex;
                DataGridViewRow selectedRow = dataGridView1.Rows[selectedrowindex];
                a = Convert.ToString(selectedRow.Cells["Nome da tarefa"].Value);
                b = Convert.ToString(selectedRow.Cells["Agendamento"].Value);
                c = Convert.ToString(selectedRow.Cells["Nome do software"].Value);

                cb_Atualiza_sof.SelectedValue =c;


    • Editado Felipe1520 terça-feira, 25 de julho de 2017 18:23
    terça-feira, 25 de julho de 2017 17:39
  • Felipe, eu não entendi exatamente o que você fez. Quer dizer que não existe um segundo form? Olha, se for isso, então você não precisa fazer sobrecarga de construtor e instancias, basta apenas atribuir o valor selecionado de um ComboBox em outro, caso estejam no mesmo form.

    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        comboBox2.SelectedIndex = comboBox1.SelectedIndex;
    }

    Uma coisa importante que é bom ter atenção é que, ambos os códigos que te passei, o primeiro e este, funcionam bem se ambas as ComboBox tiverem os mesmos itens, especificamente, a mesma quantidade de itens. Portanto, se você por um acaso tentar atribuir um indicie fora da quantidade máxima de itens de uma das comboBox, uma exceção será lançada. Então, é melhor fazer a verificação. Vamos automatizar um pouco as coisas:

    private void ChangeSelectedItemOnComboBox(ComboBox target, int indexToSelect)
    {
        if ( (indexToSelect > -1) && (indexToSelect < target.Items.Count -1) )
        {
            target.SelectedIndex = indexToSelect;
        }
    }

    Agora basta chamar o método em um Event Handler de alguma ComboBox:

    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        ChangeSelectedItemOnComboBox(comboBox2, comBox1.SelectedIndex);
    }

     fiz mas nao esta dando certo ,nao sei o por quê.

    O codigo que eu stava usando para preencher as textbox era este e da certo

                                              

      private void dataGridView1_DoubleClick(object sender, EventArgs e)
            {

                string a;
                string b;
                string c;
                int selectedrowindex = dataGridView1.SelectedCells[1].RowIndex;
                int selectedrowindex1 = dataGridView1.SelectedCells[3].RowIndex;
                int selectedrowindex2 = dataGridView1.SelectedCells[2].RowIndex;
                DataGridViewRow selectedRow = dataGridView1.Rows[selectedrowindex];
                a = Convert.ToString(selectedRow.Cells["Nome da tarefa"].Value);
                b = Convert.ToString(selectedRow.Cells["Agendamento"].Value);


               txt_atualizaTarefa.Text = a;
                maskedTextBox2.Text = b;

                pn_atualiza_tarefa.Visible = true;

    Fiz conforme vc escreveu , mas nao consegui! nao sei se fiz algo errado!!

    private void ChangeSelectedItemOnComboBox(ComboBox target, int indexToSelect)
            {
                if ((indexToSelect > -1) && (indexToSelect < target.Items.Count - 1))
                {
                    target.SelectedIndex = indexToSelect;
                }
            }

            private void cbSoftware_TextChanged(object sender, EventArgs e)
            {
                ChangeSelectedItemOnComboBox(cb_Atualiza_sof, cbSoftware.SelectedIndex);
            }


    terça-feira, 25 de julho de 2017 17:41
  • cb_Atualiza_sof.SelectedValue =c;

    Neste ponto, você checou se a coleção de valores da tua ComboBox possui o valor c?

    Como vc está populando sua ComboBox?
    terça-feira, 25 de julho de 2017 18:27
  • onsegui resolver!! 

    No local onde coloquei cb_Atualiza_sof.SelectedValue =c; troquei para cb_Atualiza_sof.TEXT =c;

    e funcionou!!

    Obrigado pela ajuda de todos!!

    terça-feira, 25 de julho de 2017 19:41
  • Bem, Felipe!
    Considero importante fazer um esclarecimento.
    Na verdade, desta forma você apenas está setando o texto no controle. Não está selecionando o item desejado.
    Antes de tudo é importante pensar como funciona uma ComboBox.
    Ela é um controle que mantém uma lista de objetos (todos os controles que implementam listas funcionam desta forma). Como estes objetos podem ser de qualquer tipo (inclusive classes com propriedades diversas), você pode definir uma destas propriedades para ser o valor do item (é a propriedade ValueMember da ComboBox, que é diferente de DisplayMember ou Text).
    Supondo que você tenha uma class tarefas, com os membros 'codigo' e 'descricao', poderia usar 'codigo' para valor e 'descricao' para mostrar.

    this.cbbTarefas1.DisplayMember = "descricao";
    this.cbbTarefas1.ValueMember = "codigo";
    this.cbbTarefas1.DataSource = tarefas;
    Com isto, você pode selecionar o item desejado pelo valor do código da tarefa.
    this.cbbTarefas1.SelectedValue = tarefaX.codigo;

    De forma mais simplificada, se você tem o texto que deseja selecionar, você pode iterar pelos itens do controle e encontrar o índice onde o texto é igual ao que você deseja selecionar. Neste momento, basta atribuir o valor ao SelectedIndex, como o pessoal sugeriu acima.

    string textoProcurado = "T";
    
    for (int i = 0; i < this.cbbTarefas1.Items.Count - 1; i++)
        if (this.comboBox1.Items[i].ToString().Equals(textoProcurado))
            this.comboBox1.SelectedIndex = i;

    No entanto ainda é necessário saber como você popula a ComboBox, para saber a propriedade correta a se usar na comparação.
    Neste exemplo usei ToString() pois criei os itens fixos.


    ATT

    quarta-feira, 26 de julho de 2017 03:08
  • Connection con1 = new Connection();
                string strSql = "SELECT id_software,Nome_software from softwares where id_software = id_software";
                SqlCommand cmd = new SqlCommand(strSql, con1.cone());
            //     con1.cone().Open();
                SqlDataReader dr = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                dt.Load(dr);
           //     cbSoftware.SelectedIndex = 0;
                cbSoftware.ValueMember = "id_software";
                cbSoftware.DisplayMember = "Nome_software";
                   cbSoftware.DataSource = dt;

    quarta-feira, 26 de julho de 2017 13:07
  • Desta maneira não funciona, pois o DataTable não tem uma propriedade id_software, apenas uma coleção de linhas onde há um par de valor associativo com rótulo id_software.
    Crie uma classe para representar seu objeto, é a forma mais prática.

    quarta-feira, 26 de julho de 2017 18:12
  • Como assim? Desculpe é que estou fazendo isso a pouco tempo , nao tenho muita noção ainda estou aprendendo!
    quarta-feira, 26 de julho de 2017 18:32
  • Tudo bem.

    O que quis dizer é pra você criar uma classe específica (se ainda não tem) pra representar seu conjunto de dados.
    O DataTable é uma estrutura genérica, como uma matriz (na verdade é uma matriz).

    Faça por exemplo:

    class Software {
      public int codigo;
      public string nome;
    }
    
    List<Software> lista = new List<Software>();
    
    foreach(DataRow row in dt.Rows) {
    
      Software temp = new Software();
      temp.codigo = row["codigo"];
      temp.nome = row["nome"];
      lista.Add(temp);
    
    }
    
    cbb.ValueMember = "codigo";
    cbb.DisplayMember = "nome";
    cbb.DataSource = lista;
    
    // com isto você poderá atribuir ao SelectedValue da ComboBox qualquer valor dos códigos da tua tabela

    Se você estava fazendo como neste último código que você postoue com isto aparecia corretamente os nomes dos softwares na ComboBox e você não queria/precise se preocupar com modelagem, você pode encontrar o item a selecionar apenas iterando nos itens da ComboBox, como sugeri acima.

    ATT

    • Marcado como Resposta Felipe1520 quinta-feira, 27 de julho de 2017 17:21
    quarta-feira, 26 de julho de 2017 21:18
  • Felipe

    Veja se esse link te ajuda.

    https://ecode10.com/artigo/416/Adicionando-Valores-no-ComboBox-


    Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.

    Mauricio Junior - Comunidade www.ecode10.com

    quinta-feira, 27 de julho de 2017 11:12
  • Entendi, muito obrigado mesmo!!!
    quinta-feira, 27 de julho de 2017 17:22
  • De nada cara, o objetivo do fórum é justamente partilhar conhecimento.
    quinta-feira, 27 de julho de 2017 18:41