POPULAR COMBOBOX DE DATAGRIDVIEW

GGERMINIANI 23/12/2013 20:30:57
#432422
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[Ô]))
Next

Porem 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!!!
MADMAX 26/12/2013 17:39:57
#432473
Ve se te ajuda, o codigo esta em C#.net mais não deve ser tão diferente assim.


//Creio que o seu problema e no momento de Setar o Combo do Grid
//Se você ver utilizo o proprio campo do grid na declaração para ficar de tipo igual

DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dgvEtiqSelecao.Rows[linha].Cells[5];





GGERMINIANI 01/01/2014 20:32:03
#432577
Olá Madmax!

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

Bem, fiz o que vc me instruiu, porem o problema persiste... fiz de duas maneiras...

Veja o exemplo prático que testei abaixo para ficar mais simples:

1) Alimentei a variável de DGVcombobox:

VB
Dim combo As New DataGridViewComboBoxCell
combo.Items.Add([Ô]1[Ô])
combo.Items.Add([Ô]2[Ô])
combo.Items.Add([Ô]3[Ô])


C#
DataGridViewComboBoxCell combo = new DataGridViewComboBoxCell();
combo.Items.Add([Ô]1[Ô]);
combo.Items.Add([Ô]2[Ô]);
combo.Items.Add([Ô]3[Ô]);




2) Criei a linha do DGV:

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




3) Fiz o DirectCast sugerido por você de duas maneiras:

#Método1
VB
Dim cell As DataGridViewComboBoxCell = DirectCast(DGV.Rows(0).Cells(6), DataGridViewComboBoxCell)
DGV.Rows(0).Cells(3) = cell [ô]ou
DGV.Rows(0).Cells(3).Value = cell


C#
Dim cell As DataGridViewComboBoxCell = DirectCast(DGV.Rows(0).Cells(6), DataGridViewComboBoxCell)
DGV.Rows(0).Cells(3) = cell;
//ou
DGV.Rows(0).Cells(3).Value = cell;




#Método2
VB
DGV.Rows(0).Cells(3) = DirectCast(DGV.Rows(0).Cells(3), DataGridViewComboBoxCell)


C#
DGV.Rows(0).Cells(3) == (DataGridViewComboBoxCell)DGV.Rows(0).Cells(3)



Porem os dois métodos continuam aparecendo a mensagem de erro - print postado acima.

Fiz algo errado?

Grato.
GGERMINIANI 01/01/2014 20:41:51
#432578
Ah, para esclarecer a estrutura do DataGridView, mostro abaixo a configuração do mesmo:

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



C#
var _with1 = DGV;
_with1.ColumnCount = 3;
_with1.Columns(0).Name = [Ô]Col 1[Ô];
_with1.Columns(1).Name = [Ô]Col 2[Ô];
_with1.Columns(2).Name = [Ô]Col 3[Ô];


DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
var _with2 = column;
_with2.HeaderText = [Ô]Col CombBox[Ô];
_with2.Name = [Ô]colcombo[Ô];
_with2.FlatStyle = FlatStyle.Standard;
_with2.SortMode = DataGridViewColumnSortMode.Automatic;
_with2.CellTemplate = new DataGridViewComboBoxCell();

DGV.Columns.Insert(3, column);
PROGRAMADORVB6 01/01/2014 22:28:20
#432582
Olá, eu sei que é um pouco básico, mas colocou no inicio de tudo : Option Strict On
Não é de muita ajuda, mas por vezes soluciona alguns erros.
GGERMINIANI 02/01/2014 14:52:32
#432594
Olá ProgramagadorVB6...

Boa tarde.

Na verdade estava desativado.

Subi para ON, fiz as conversões manualmente, mas o erro persiste.

Obrigado.
GGERMINIANI 02/01/2014 19:24:03
#432600
Pessoal,

Para tentar facilitar, criei um projetinho simples com está situação, ocasionando o problema que relato.

Grato.
MADMAX 03/01/2014 15:07:28
#432623
GGERMINIANI vou tentar te ajudar porem aqui so tenho o Visual Studio 2005 e 2008 , chegando em casa vou ver se consigo abrir
GGERMINIANI 05/01/2014 13:10:41
#432662
Ok Madmax.

Obrigado.

Realmente estou tentando por diversas formas, mas não estou achando a solução deste erro.

Grato.
Faça seu login para responder