Ir para o conteúdo

DataGridViewComboBoxColumn Editável

A DataGridViewComboBoxColumn é uma coluna onde estão diversas DataGridViewComboBoxCell, ou seja, caixas de selecção que permitem seleccionar um item de uma lista de itens. Esses itens podem ser definidos de diversas formas e podem mesmo estar ligados a uma fonte de dados. No entanto, e através de uma inserção normal, não é possível editar a ComboBox.

Uma das formas de o fazer é utilizando o evento EditingControlShowing para alterar o tipo de ComboBox, de modo a permitir a edição. Esta opção não está disponível no IDE como propriedade e é possível apenas consegui-lo através de código.

Exemplo

Este pequeno exemplo mostra como o fazer, sendo diferente se a ComboBox estiver vinculada a uma fonte de dados. No entanto, este exemplo mostra o processo a seguir.

    Private dgvComboColumn As DataGridViewComboBoxColumn

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Definições da ComboBoxColumn e insere alguns itens
        dgvComboColumn = New DataGridViewComboBoxColumn
        With dgvComboColumn
            .Name = "ComboBoxColumn"
            .HeaderText = "Seleccionar"
            .Items.AddRange(New Object() {"Banana", "Morango", "Laranja"})
        End With

        ' Adiciona a ComboBoxColumn à DataGridView
        Me.DataGridView1.Columns.Add(dgvComboColumn)

    End Sub

    ' No evento EditingControlShowing vai alterar o tipo de ComboBox
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

        ' Verifica se a coluna é a pretendida e define o novo tipo (DropDown)
        If Me.DataGridView1.CurrentCell.ColumnIndex = dgvComboColumn.Index Then

            Dim cb As ComboBox = DirectCast(e.Control, ComboBox)
            cb.DropDownStyle = ComboBoxStyle.DropDown

            ' Adiciona um evento para verificar se é um novo item
            AddHandler cb.Leave, AddressOf comboBoxLeave

        End If

    End Sub

     ' Quando o focus sai da ComboBox
     Sub comboBoxLeave(ByVal sender As Object, ByVal e As System.EventArgs)

        Dim cb As ComboBox = DirectCast(sender, ComboBox)

        ' Caso o item não esteja na lista
        If Not dgvComboColumn.Items.Contains(cb.Text) Then

            Dim msg As String = "Deseja inserir este novo item na lista ?"

            Dim result As DialogResult
            result = MessageBox.Show(msg, My.Application.Info.Title, MessageBoxButtons.YesNo, MessageBoxIcon.Question)

            ' Caso pretenda inserir o novo item, adiciona-o
            If result = Windows.Forms.DialogResult.Yes Then

                dgvComboColumn.Items.Add(cb.Text)

                ' Selecciona o novo item
                Me.DataGridView1("ComboBoxColumn", DataGridView1.CurrentRow.Index).Value = cb.Text

            End If

        End If

    End Sub