Usuário com melhor resposta
Combobox em Datagridview

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
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
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
-
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
-
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
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
-
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
-
-
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
-
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
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
-
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
-
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
-
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
-
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
-
-
-
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