Jump to content
GGerminiani

Popular Combobox de Datagridview

Recommended Posts

Prezados,
Boa tarde!

Eu sei que é um infortúnio mandar pergunta no final da aula (estamos extremamente próximos ao Natal!), mas realmente é uma dúvida que está me incomodando...

Já tentei por diversas maneiras popular um combobox num datagridview, mas o .NET não está colaborando.

Quero uma função que me traga um DGV populado. Até aqui, ok, realizo vários, sem problemas... é que neste caso, quero colocar um Combobox (até aqui, também sem problemas), mas no momento que tento preeche-lo, o runtime me retorna um erro.

 


    Public Shared Function DGV_Autorizacoes(DGV As DataGridView) As DataGridView

        Try

            DGV.Columns.Clear()

            'AQUI PREPARO A FORMATAÇÃO DO DGV
            With DGV
                .DefaultCellStyle.Font = New Font("Consolas", 12)
                '.ReadOnly = True
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
                .AllowUserToAddRows = False
                .AlternatingRowsDefaultCellStyle.BackColor = Color.Bisque
                .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                .AllowUserToResizeColumns = False
                .RowHeadersVisible = False
                .AllowUserToResizeRows = False 'não permite redimensionar a linha
                .MultiSelect = False 'selecionar várias linhas = falso
                .ColumnCount = 6
                .Columns(0).Name = "Código"
                .Columns(1).Name = "Nome"
                .Columns(2).Name = "Documento"
                .Columns(3).Name = "CPF"
                .Columns(4).Name = "Parentesco"
                .Columns(5).Name = "ID_TELEFONE"
                .Columns(0).Visible = False
                .Columns(1).AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill
                .Columns(2).Width = 100
                .Columns(3).Width = 200
                .Columns(4).Width = 300
                .Columns(5).Visible = False
            End With


            'INSIRO A COLUNA DE COMBOBOX
            Dim column As New DataGridViewComboBoxColumn()
            With column
                .HeaderText = "Telefone(s)"
                .Name = "telefone"
                .Width = 150
                .FlatStyle = FlatStyle.Standard
                .SortMode = DataGridViewColumnSortMode.Automatic
                .CellTemplate = New DataGridViewComboBoxCell()
            End With
            DGV.Columns.Insert(6, column)


            For Each columns As DataGridViewColumn In DGV.Columns
                DGV.Columns(columns.Index).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            Next


            
            _query = "select * from AUTORIZACOES"
            Dim comm2 As OleDbCommand = New OleDbCommand(_query, _cn)
            Dim da2 As OleDbDataAdapter = New OleDbDataAdapter(comm2)
            Dim ds2 As DataSet = New DataSet()
            da2.Fill(ds2, "AUTORIZACOES")


            Dim _AUTS() As DataRow = ds2.Tables("AUTORIZACOES").Select

            For Each registro As DataRow In ds2.Tables("AUTORIZACOES").Rows

                'FAÇO A PESQUISA NO BD REFERENTE À UM ID
                _query = "select * from TELEFONES where ID = @id"
                Dim comm As OleDbCommand = New OleDbCommand(_query, _cn)
                comm.Parameters.AddWithValue("@id",_registro("ID"))
                Dim da As OleDbDataAdapter = New OleDbDataAdapter(comm)
                Dim ds As DataSet = New DataSet()
                da.Fill(ds, "TELEFONES")

                Dim _TELS() As DataRow = ds.Tables("TELEFONES").Select

                'CRIO UMA COMBOBOX DE DGV PARA ARMAZENAR OS VALORES
                Dim combo As New DataGridViewComboBoxCell
                For Each registro2 As DataRow In ds.Tables("GRUPOS").Rows
                    combo.Items.Add(registro2("TELEFONE"))
                Next

                'POPULO A LINHA COM AS INFORMAÇÕES DA AUTORIZAÇÃO + O COMBOBOX
                DGV.Rows.Add(registro("COLUNA1"), registro("COLUNA2"), registro("COLUNA3"), registro("COLUNA4"), registro("COLUNA5"), registro("COLUNA6"), combo)

            Next
            
            Return DGV

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Alerta de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return Nothing
        Finally
            If _cn.State = ConnectionState.Open Then _cn.Close()
        End Try

    End Function

End Class

 

 

O problema está aqui:

 

Crio uma variável estilo ComboBox para célula e vou preenchendo informações nela...

Dim combo As New DataGridViewComboBoxCell                For Each registro2 As DataRow In ds.Tables("GRUPOS").Rows                    combo.Items.Add(registro2("TELEFONE"))                NextPorem quando tento adiciona-la à linha, o sistema me apresenta erro.                'POPULO A LINHA COM AS INFORMAÇÕES DA AUTORIZAÇÃO + O COMBOBOX                DGV.Rows.Add(registro("COLUNA1"),[...] combo)

 

Caixa_de_Di%C3%A1logo_de_Erro_Padr%C3%A3

 

Desde já, muito obrigado e boas festas à todos!!!

:natallaugh:

Edited by GGerminiani

Share this post


Link to post
Share on other sites

Khaos,
Boa tarde.

Primeiramente muito obrigado pela resposta e aproveito para lhe desejar um bom 2014!


Tentei realizar colocando o .ToString, porem o erro persiste.

Para simplificar o problema acima, fiz um exemplo prático e rápido do que estou tentando:

 

 

1) Configuração do DataGridView:

 

            With DGV
                .ColumnCount = 3
                .Columns(0).Name = "Col 1"
                .Columns(1).Name = "Col 2"
                .Columns(2).Name = "Col 3"
            End With


            Dim column As New DataGridViewComboBoxColumn()
            With column
                .HeaderText = "Col CombBox"
                .Name = "colcombo"
                .FlatStyle = FlatStyle.Standard
                .SortMode = DataGridViewColumnSortMode.Automatic
                .CellTemplate = New DataGridViewComboBoxCell()
            End With

            DGV.Columns.Insert(3, column)

 

 

2) Alimento a variável de DGV_ComboBox:

 

Dim combo As New DataGridViewComboBoxCell
combo.Items.Add("1")
combo.Items.Add("2")
combo.Items.Add("3")

 

 

3) Crio a linha no DGV:

 

DGV.Rows.Add(0,1,2,combo)

 

 

BUG:

Caixa_de_Di%C3%A1logo_de_Erro_Padr%C3%A3

 

Alguma ideia?

Share this post


Link to post
Share on other sites

Khaos,

Boa tarde.

 

Infelizmente não.

 

O método que eles discutem é tendo um conteúdo dentro do ComboBox fixo.

 

No caso o meu seria variável.

 

Para facilitar a quem queira se aventurar, criei um projetinho com a situação que ocasiona o erro.

 

Segue link:

http://www.sendspace.com/file/ka00e3

 

Grato.

Share this post


Link to post
Share on other sites

Simplificando...

 

Neste DataGridView, vou trazer EMPRESAS ok?

 

Porem, na estrutura de meu BD, criei uma tabela TELEFONES, sendo que a Empresa pode ter vários números cadastrados...

 

Portanto, a cada linha do DGV, na minha coluna TELEFONES, gostaria que fosse ComboBox, trazendo todos os contatos daquela empresa.

 

Nos métodos apresentados acima, simplesmente eles inserem a coluna com Combobox, com valores já definidos no combo, por exemplo, "amarelo, azul e vermelho".

 

Grato.



O projeto que anexei no sendspace ilustra bem o que gostaria de fazer.

 

Ele está simples e leve.

Share this post


Link to post
Share on other sites

Então cara, você vai ter que criar na sua coluna do gridView uma ComboBoxColumn exatamente no modelo que eu passei para você lá no link de exemplo. Depois você só precisa criar um dataTable e usar a propriedade DataSource para estes comboboxes

Share this post


Link to post
Share on other sites

Depois de 5 anos me deparei com a mesma situação.... para quem tiver o mesmo problema, posto aqui como foi solucionado:

 

Primeiramente, todo o trabalho com meu grid é através de código (tanto formatação, quanto população)....

 

Formatação:

Public Shared Function dgvContato(DGV As DataGridView) As DataGridView

        Try

            DGV.Columns.Clear()

            With DGV
                .DefaultCellStyle.Font = New Font("Consolas", 12)
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
                .AllowUserToAddRows = False
                .AlternatingRowsDefaultCellStyle.BackColor = Color.Bisque
                .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                .AllowUserToResizeColumns = False
                .RowHeadersVisible = False
                .AllowUserToResizeRows = False
                .MultiSelect = False

                .ColumnCount = 4
                .Columns(0).Name = "ID"
                .Columns(1).Name = "Nome"
                .Columns(2).Name = "Data Criação"
                .Columns(3).Name = "Data Modififcação"

                .Columns(0).Visible = False
                .Columns(1).AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill
                .Columns(2).Width = 170
                .Columns(3).Width = 170

                .Columns(0).ReadOnly = True
                .Columns(1).ReadOnly = True
                .Columns(2).ReadOnly = True
                .Columns(3).ReadOnly = True

                .Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                .Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter


                'Criação de um Combobox dentro do DGV, para mostrar os telefones dos meus contatos
				Dim column As New DataGridViewComboBoxColumn()
                With column
                    .HeaderText = "Telefone(s)"
                    .Name = "telefone"
                    .ReadOnly = False
                    .Width = 170
                    .FlatStyle = FlatStyle.Standard
                    .DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                    .CellTemplate = New DataGridViewComboBoxCell()
                End With
                DGV.Columns.Insert(2, column)

            End With

            For Each columns As DataGridViewColumn In DGV.Columns
                DGV.Columns(columns.Index).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            Next

            Return DGV

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Alerta de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return Nothing
        End Try

    End Function

 

População:


    Public Shared Function dgvContatosPop(DGV As DataGridView) As DataGridView

        Try

            Dim cnCompras As New Connection.compras_flEntities

            Dim pesquisa = From c In cnCompras.contatos Select c
            Dim index As Integer = 0

            If pesquisa.Count > 0 Then

                For Each i In pesquisa

                    cnCompras = New Connection.compras_flEntities
                    Dim telefones = (From c In cnCompras.contatos
                                     Join t In cnCompras.telefones
                                        On c.id_contato Equals t.id_contato
                                     Where z.id_contato = i.id_contato
                                     Select t).ToList

                    DGV.Rows.Add(i.id_zelador, i.nome, Nothing, Nothing, i.data_criacao, i.data_modificacao)

					'Aqui começo a popular o Combobox do DGV
                    Dim comboItens As New DataGridViewComboBoxCell
                  
                    If telefones.Count > 0 Then

                        For Each t In telefones

                            Dim tel As String = t.numero.ToString
                            Dim obs As String = String.Empty

                            If t.descricao.ToString.Equals(String.Empty) = False Then
                                obs = " (" & t.descricao.ToString.Trim & ")"
                            End If

                            comboItens.Items.Add(t.numero & obs)

                        Next
                    Else
                        comboItens = Nothing
                    End If

					'Depois do meu Combobox populado, faço meu DGV receber os itens
                    DGV.Rows(index).Cells("telefone") = comboItens
                    index += 1

                Next

                DGV.Rows(0).Cells(0).Selected = False

            End If

            Return DGV

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Alerta de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return Nothing

        End Try

    End Function

 

Enfim, foi isso.

Obrigado à todos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.