Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Dicas de Programação #12

ComboBox editável em uma DataGridViewComboBoxColumn

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.

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





Comparar se duas imagens são iguais

Uma das formas de comparar se duas imagens são iguais é convertendo as imagens, utilizando o método Convert.ToBase64String(), para uma string. Este método converte um array de 8-bit inteiros para a sua representação com base em 64 dígitos.

É um método muito simples para algumas aplicações onde é necessário comparar imagens.

Atenção: não confundir com tamanho, dimensão, etc,

    ''' <summary>
    ''' Converte a imagem para base 64
    ''' </summary>
    ''' <param name="image">Imagem a converter</param>
    ''' <param name="format">Formato da imagem</param>
    Public Function ImageToBase64String(ByVal image As Image, ByVal format As Imaging.ImageFormat) As String 

        Dim base64String As String = String.Empty
        Using memory As New IO.MemoryStream()
            image.Save(memory, format)
            base64String = Convert.ToBase64String(memory.ToArray())
        End Using 

        Return base64String

    End Function

    ' Verifica se as imagens são iguais ou não
    Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click 

        ' Guarda as imagens em memória
        Dim img1 As Image = Image.FromFile("c:\image1.jpg")
        Dim img2 As Image = Image.FromFile("c:\image2.jpg") 

        ' Converte as imagens para base 64
        Dim base64String1 As String = ImageToBase64String(img1, Imaging.ImageFormat.Jpeg)
        Dim base64String2 As String = ImageToBase64String(img2, Imaging.ImageFormat.Jpeg) 

        ' Compara se as strings geração são iguais
        If base64String1 = base64String2 Then
            MessageBox.Show("As imagens são iguais")
        Else
            MessageBox.Show("As imagens são diferentes")
        End If 

    End Sub


PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

3 comentários:

Fla' disse...

Boa tarde jpaulino, o que eu andava á procura era tipo isto, só que em vez de adicionar uma nova coluna, não adicionava, eu tirei essa parte do código mas deu erro, alguma coisa deve ser mais mudada e eu nao sei o que é

é assim, eu queria introduzir o valor e ele acrescentar, mas mostrar tambem numa outra combobox existente.

não sei se me fiz explicar bem... mas espero que me ajudes pf, necessito mesmo disto

Gustavo Tomé disse...

Código muito show....veja se voce pode me ajudar nestas situações:
1) tenho 2 combobox e um PictureBox. Quando eu clicar no combo1 deverá aparecer os nomes das tabelas. ex:(lote, edificação, etc...). 2) Na lista que irá aparecer no combo1, eu vou clicar por ex. em "lote" e no meu combo2 irá aparecer as descrições do "lote"(ocupação, patrimonio, utilização, etc...). Vejam que eu possuo uma tabela chamada "ocupação", outra "patrimonio", outra "utilização". situação 3) Já no combo2, quando eu escolher uma das opções, ex. "utilização", o meu PictureBox irá mostrar um gráfico com todas as opções de "utilização", ex.(residencial, comercial, publica, etc...). Para mim que sou novato em VB.Net, ta muito complicado. Sempre atuei como Analista e muito pouco como desenvolvedor. Se alguem puder me passar um exemplo pratico e direto pra que possa ganhar um certo tempo, agradeço....

Heitor Marques disse...

Cara desenvolvo um software de topografia aqui no Brasil mas tinha apanhado muito para fazer isso, o link foi de grande ajuda. Parabéns pelo trabalho. http://topoham.org
Heitor

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico