none
Combobox em Datagridview RRS feed

  • Pergunta

  • Ola senhores, bom dia.

    Acho que estou deixando passar algo obvio mas, vamos lá. Pesquisei exaustivamente os exemplos ja citados aqui e em outras fontes e não consegui achar a solução do meu problema (e qdo acontece assim, a resposta a ele normalmente é obvia e eu nao a enxergo, rsrsrsr).

    Tenho em um form em datagridview que é populado através de um dataset. Até aí tudo bem. O problema é que uma dessas colunas deveria ser uma combobox pois, no dataset que popula esse grid, tem lá uma coluna que é o codigo de uma conta. Explicando melhor: no dataset que popula esse grid tem DESCRICAO, VALOR e ID CONTA. Esses valores populam colunas DESCRICAO, VALOR E "NOME DA CONTA", dai, a combobox que deveria mostrar o nome da conta cuja ID vem do dataset.

    Bem, criei o datagridview com essas colunas e acrescentei:

                    dsContas = clnContas.CarregaGrContas
                    Me.CONTAVAR.DataSource = dsContas.Tables(0)
                    'atribui o valor que será exibido na coluna 
                    Me.CONTAVAR.DisplayMember = "DESCRICAO"
                    'atribui o valor que será lido quando um item for selecionado
                    Me.CONTAVAR.ValueMember = "ID_CON"

    - Dai o problema. Como recuperar /setar a coluna ValueMember se não há "SelectedIndexChange"?

    tentei popular o grid com algumas linhas, e a combo esta funcionando perfeitamente mas quando quero recuperar os dados nao consigo visualizar o valueMember.

            For Each dvr As DataGridViewRow In dgvVarios.Rows
                If IsNothing(dvr.Cells("Historico").Value) = False Then
                    If IsDBNull(dvr.Cells("IDVAR").Value) = True Then
                        'Gravando um novo item
                        MsgBox("Novo " & Me.CONTAVAR.ValueMember.ToString)
                    Else
                        'Alterando um item
                        MsgBox("Alteracao")
                    End If
                End If
            Next

    Alguem me esclarece? De antemão, obrigado.

    Luiz Melo


    Luiz Melo

    • Tipo Alterado Luiz Melo quinta-feira, 30 de agosto de 2012 13:40 Para qualificacao
    terça-feira, 28 de agosto de 2012 11:42

Respostas

  • Entendi, veja se isso atende sua necessidade

    Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)
                      Dim editingComboBox As ComboBox = CType(e.Control, ComboBox)
                      If Not editingComboBox Is Nothing Then
                            AddHandler editingComboBox.SelectedIndexChanged, AddressOf editingComboBox_SelectedIndexChanged
                      End If
    End Sub
     
    Private Sub editingComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
                      Dim comboBox1 As ComboBox = CType(sender, ComboBox)
                      ' Display index
                      MessageBox.Show(comboBox1.SelectedIndex.ToString())
                      ' Display value
                      MessageBox.Show(comboBox1.Text)
    End Sub

    http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/6fd3c9ae-71d9-4904-a996-e156212bf59d

    Att.,

    Jeimes Ribeiro

    "Caso a resposta seja útil, marque como resposta"

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quarta-feira, 29 de agosto de 2012 17:36
  • Olá Luiz

    Quando colei o código ficou faltando uma coisa

    No Private Sub DatagridView1_EditingControl..., no final adicione "Handles DataGridView1.EditingControlShowing" sem as aspas. Lembrando que o nome datagridview1 você deve alterar para o nome do seu datagrid.

    Neste exemplo ele não indica a coluna, ele identifica que é um combobox e mostra o (SelectedIndex ou SelectedValue) o que preferir e o texto selecionado.

    Fiz um teste aqui e funcionou, tente aí e retorne.

    Att.,

    Jeimes Ribeiro

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quinta-feira, 30 de agosto de 2012 11:33
  • Luiz, este exemplo abaixo ficou mais simples e você pode colocar a sua coluna combobox do grid, veja:

    Obs.: Altere o nome colCombo para o nome do seu Combobox no Datagridview

    Private cbo As DataGridViewComboBoxEditingControl Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing If DataGridView1.CurrentCell.ColumnIndex = colCombo.Index Then cbo = CType(e.Control, DataGridViewComboBoxEditingControl) AddHandler cbo.SelectedIndexChanged, AddressOf cbo_SelectedIndexChanged End If End Sub Private Sub cbo_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) MessageBox.Show(cbo.SelectedValue) End Sub

    Att.,

    Jeimes Ribeiro

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quinta-feira, 30 de agosto de 2012 12:28

Todas as Respostas

  • Bom dia Luiz.

    Sua pergunta foi bem formulada, mas fiquei infelizmente fiquei com dúvidas.

    O Combo que você cita é como o da imagem? Está inserido dentro do datagrid?

    Você vai criar uma combo para cada linha somente para mostrar uma única informação, o ID dela? Ou ele vai conter uma lista com tipos de contas , como Cliente Classe A, ...B e C e e você quer que ao seleciona-lo, alterando a classe do cliente, o banco de dados seja atualizado?

    Me ajuda com essas dúvidas que posso tentar te ajudar.

    sds

    terça-feira, 28 de agosto de 2012 13:48
  • Ola Bisewski01. Grato pela atenção.

    Trata-se do seguinte cenário: Em um grid anterior eu tenho lançamentos feitos em uma tabela. Quando da seleçao do usuário para editar uma row desse grid anterior eu carrego esse lançamento individual em um form de ediçao. Veja, são lançamentos de despesas tipo Dia 2, Historico "Despesas com Fim de semana", Valor "200,00", "Conta (ID-02) Entretenimento. Acontece que essa despesa em particular pode ser desmembrada em vários lançamentos e em contas distintas, por exemplo: Lancto 1= Historico: "Almoço", Valor: "50,00", Conta: (ID-03) Alimentação, Lancto 2 = Hist: "Cinema", Valor 50,00, Conta: (ID-04) Entretenimento, Lcto 3 = Historico: "Outras^, Valor: 100,00, Conta (ID-05) Outras Despesas. Devo então mostras em outro grid esses Lancamentos com as colunas Historico, valor, conta, onde em conta o usuario podera eventualmente trocar a referencia. mas na hora de regravar os dados eu gravo o ID da conta e nao o nome, entende... Não sei se fui claro mas, basicamente o grido mostraria o nome da conta mas eu gostaria de trabalhar com o ID dela...

    Como se no seu exemplo o ID da matematica fossi o 1, do portugues 2 e assim sucessivamente...

    Claro que se fosse sequencial nao teria problema mas como é outra tabela, os ID podem variar conforme a manutencao...

    Espero ter me feito entender..

    Grato.

    Luiz Melo 


    Luiz Melo

    terça-feira, 28 de agosto de 2012 15:26
  • Olá Luiz

    Esse exemplo do Macoratti tem o que necessita.

    Caso necessite, pode baixar o exemplo.

    Att.,

    Jeimes Ribeiro

    "Caso a resposta seja útil, marque como resposta"

    quarta-feira, 29 de agosto de 2012 11:32
  • Ola Jeimes,

    Caro amigo eu ja havia pesquisado ate ai e minha soluçao faz exatamente como no exemplo do macoretti. O grande problema está em, ao ser selecionado um dos itens da combobox, eu ter acesso ao valuemember desta coluna... . Exemplo: se a pessoa escolher um elemento do combo eu ter acesso ao ID desse elemento...entende?

    Acho que vou desistir... acho que ninguem vai me ajudar em tempo habil. O que vou fazer é ler o que esta na coluna e reler o arquivo donde veio baseado no conteudo dessa coluna. É tosco mas resolve.

    Luiz Melo


    Luiz Melo

    quarta-feira, 29 de agosto de 2012 16:38
  • Entendi, veja se isso atende sua necessidade

    Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)
                      Dim editingComboBox As ComboBox = CType(e.Control, ComboBox)
                      If Not editingComboBox Is Nothing Then
                            AddHandler editingComboBox.SelectedIndexChanged, AddressOf editingComboBox_SelectedIndexChanged
                      End If
    End Sub
     
    Private Sub editingComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
                      Dim comboBox1 As ComboBox = CType(sender, ComboBox)
                      ' Display index
                      MessageBox.Show(comboBox1.SelectedIndex.ToString())
                      ' Display value
                      MessageBox.Show(comboBox1.Text)
    End Sub

    http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/6fd3c9ae-71d9-4904-a996-e156212bf59d

    Att.,

    Jeimes Ribeiro

    "Caso a resposta seja útil, marque como resposta"

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quarta-feira, 29 de agosto de 2012 17:36
  • Caro Jeimes.

    Com certeza será isso que resolverá o meu problema. Mas, desculpe a falta de pratica, isso ainda está uma sopa de letrinhas... Meu datagrid onde está a coluna com a combo chama-se dgvVarios e minha coluna com a combo chama-se CONTAVAR. Como seria? Podes fazer essa ultima gentileza? Tentei algumas maneiras mas não deu certo. Grato de antemao.

    Luiz Melo


    Luiz Melo

    quarta-feira, 29 de agosto de 2012 19:26
  • Olá Luiz

    Quando colei o código ficou faltando uma coisa

    No Private Sub DatagridView1_EditingControl..., no final adicione "Handles DataGridView1.EditingControlShowing" sem as aspas. Lembrando que o nome datagridview1 você deve alterar para o nome do seu datagrid.

    Neste exemplo ele não indica a coluna, ele identifica que é um combobox e mostra o (SelectedIndex ou SelectedValue) o que preferir e o texto selecionado.

    Fiz um teste aqui e funcionou, tente aí e retorne.

    Att.,

    Jeimes Ribeiro

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quinta-feira, 30 de agosto de 2012 11:33
  • Sr. Jeimes, Bom Dia!

    Acho que agora estamos quase lá. O único problema é que esse grid tem colunas com text e valor currency. Dai quando cai nela, dá um erro pois espera-se uma combobo0x. Veja o erro abaixo:

    Acho que falta um if para identificar o tipo da coluna... tentei algumas coisas mas confesso que estou atirando no escuro.

    Agradeço a ajuda até o momento.

    Luiz Melo


    Luiz Melo

    quinta-feira, 30 de agosto de 2012 12:06
  • Luiz, este exemplo abaixo ficou mais simples e você pode colocar a sua coluna combobox do grid, veja:

    Obs.: Altere o nome colCombo para o nome do seu Combobox no Datagridview

    Private cbo As DataGridViewComboBoxEditingControl Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing If DataGridView1.CurrentCell.ColumnIndex = colCombo.Index Then cbo = CType(e.Control, DataGridViewComboBoxEditingControl) AddHandler cbo.SelectedIndexChanged, AddressOf cbo_SelectedIndexChanged End If End Sub Private Sub cbo_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) MessageBox.Show(cbo.SelectedValue) End Sub

    Att.,

    Jeimes Ribeiro

    • Marcado como Resposta Luiz Melo quinta-feira, 30 de agosto de 2012 13:40
    quinta-feira, 30 de agosto de 2012 12:28
  • Caro Jeime.

    Agradeço imensamente a ajuda e paciência. Tudo agora funciona perfeitamente e eu não teria conseguido sem sua ajuda. Muito Obrigado!

    Luiz Melo


    Luiz Melo

    quinta-feira, 30 de agosto de 2012 12:43
  • Olá Luiz

    Fico contente que tenha conseguido resolver o problema.

    Não esqueça de marcar como resposta o código que solucionou o problema, assim facilitará em buscas futuras de usuários que tenham a mesma dificuldade.

    Att.,

    Jeimes Ribeiro

    quinta-feira, 30 de agosto de 2012 12:52
  • Graaaaande Jeimes... Está na escuta?

    Espero que sim... Não sei se deveria abrir um outro post mas vamos lá:

    ...E a volta?

    Gravei os registros perfeitamente. Agora surgiu o problema: Ao carregá-los para ediçao eu deveria mostrar, em cada combobox da row do gridview a conta escolhida quando da inclusão. E nada ndo que tentei funcionou... Veja nas imagens... Dá um erro de que o campo nao existe mas, como voce pode ver nos watchs embaixo, ele assumiu o valor... E o combo esta com os valores certos...

    Podes dar uma luz nessa também?

    Na duvida abrire4i outro post com o titulo - Combobox no DatagridView - O RETORNO!

    Obrigado,

    Luiz Melo


    Luiz Melo



    • Editado Luiz Melo sexta-feira, 31 de agosto de 2012 11:22
    sexta-feira, 31 de agosto de 2012 10:55