GGerminiani 0 Report post Posted December 23, 2013 (edited) 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) Desde já, muito obrigado e boas festas à todos!!! :natallaugh: Edited December 23, 2013 by GGerminiani Share this post Link to post Share on other sites
KhaosDoctor 242 Report post Posted December 26, 2013 Coloque um .ToString() depois de registro2("TELEFONE") Share this post Link to post Share on other sites
GGerminiani 0 Report post Posted January 1, 2014 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: Alguma ideia? Share this post Link to post Share on other sites
KhaosDoctor 242 Report post Posted January 2, 2014 Veja se algum desses exemplos ajudam: http://stackoverflow.com/questions/18677772/combobox-column-within-databound-datagridview http://vb.net-informations.com/datagridview/vb.net_datagridview_combobox.htm Share this post Link to post Share on other sites
GGerminiani 0 Report post Posted January 2, 2014 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
KhaosDoctor 242 Report post Posted January 8, 2014 O seu seria variável como? Share this post Link to post Share on other sites
GGerminiani 0 Report post Posted January 8, 2014 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
KhaosDoctor 242 Report post Posted January 9, 2014 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
GGerminiani 0 Report post Posted September 12, 2018 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