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 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:
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
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....
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
Enviar um comentário