O controlo ComboBox é um controlo muito utilizado nas aplicações. É na realidade a combinação de uma TextBox com uma ListBox. Este permite que sejam definidos alguns estilos o que permite ao utilizado inserir ou escolher dados, ou apenas escolher.
Apesar de bastante simples de utilizar, existem diferentes formas de adicionar itens à lista. Este artigo pretende mostrar algumas das formas de adicionar itens à ComboBox.
A utilização de uma base de dados com fonte de dados é muito comum. Neste pequeno exemplo é lida uma tabela de Access, através de um OleDbDataAdapter e preenchido um DataSet. Depois é definida a fonte de dados (DataSource), o item a listar (DisplayMember) e o item que guarda o valor (ValueMember).
A utilização de parâmetros para o comando Transact-SQL é muito importante. Neste caso tratasse de um exemplo simples, mas o uso de parâmetros evita um grande número de problemas, com é o caso de: formatos das datas (não é necessário especificar o formato correcto), nomes com aspas simples (não é necessário substituir as aspas dos nomes, como é o caso de O’Brien), valores numérico (não é necessário formatar os números), etc.
Imports System.Data.OleDb
' No evento Form Load irá ser carregados os dados da base de dados na combobox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadTry
Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados.mdb;"
' Inicia uma ligação à base de dados
Using connection As New OleDbConnection(connString)' Select Statement que irá mostrar todos os vendedores activos,
' excepto o vendedor que será definido no parâmetro
Dim SQL As String = "SELECT * FROM Vendedores WHERE activo = ? AND vendedor <> ?"' Define o DataAdapter e os parâmetros. O DataAdapter guarda a ligação, não
' sendo necessário abrir com o comando connection.Open()
Dim da As New OleDbDataAdapter(SQL, connection)
da.SelectCommand.Parameters.Add("activo", OleDbType.Boolean).Value = True
da.SelectCommand.Parameters.Add("vendedor", OleDbType.VarChar).Value = "Jorge Paulino"' Preenche o Dataset com os valores da base de dados
Dim ds As New DataSet
da.Fill(ds)' Preenche a combobox
With Me.ComboBox1
.DisplayMember = "vendedor"
.ValueMember = "id"
.DataSource = ds.Tables(0).DefaultView' Definições para autocomplete
.DropDownStyle = ComboBoxStyle.DropDown
.AutoCompleteMode = AutoCompleteMode.Suggest
.AutoCompleteSource = AutoCompleteSource.ListItems
End With' Insere um novo item geral na posição 0
' com uma descrição geral a indicar o tipo de lista
Dim dr As DataRow
dr = ds.Tables(0).NewRow
dr.Item("id") = 0
dr.Item("vendedor") = "Lista Vendedores"
ds.Tables(0).Rows.InsertAt(dr, 0)
' Selecciona o item inserido
Me.ComboBox1.SelectedIndex = 0End Using
Catch ex As Exception
MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
End Sub
Para verificar o item seleccionado, ou o valor, basta fazer o seguinte:
Debug.WriteLine("Valor seleccionado: " & Me.ComboBox1.SelectedValue)
Debug.WriteLine("Texto seleccionado: " & Me.ComboBox1.Text)
Depois, pode-se validar e forçar a seleccionar o item da lista. Para o fazer pode-se utilizar o seguinte código, que verifica se o texto da ComboBox está disponível na sua lista, e caso contrário, mostra uma mensagem de erro e selecciona o item por defeito.
Este exemplo não se aplica se o estilo seleccionado for o DropDownList.
' No evento Leave verifica se o item escolhido/inserido existe na lista
Private Sub ComboBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave' Guarda a informação do texto actual
Dim comboText As String = Me.ComboBox1.Text' Pesquisam texto na ComboBox e caso não encontre
If Me.ComboBox1.FindString(comboText) = -1 Then
MessageBox.Show("O vendedor seleccionado não é válido")
Me.ComboBox1.SelectedIndex = 0
End IfEnd Sub
Mas existem métodos mais simples de carregar dados na ComboBox. Pode-se, por exemplo, usar um destes métodos para inserir itens à ComboBox em modo run-time .
' Define um array de meses
Dim items() As String = {"Jan", "Fev", "Mar", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"}' Adiciona o itens à ComboBox e define o estilo com
' DropDownList, ou seja, apenas é possível seleccionar
With Me.ComboBox2
.DropDownStyle = ComboBoxStyle.DropDownList
.Items.AddRange(items)
End With
Finalmente um método bastante usual que insere 50 itens com o formato “01”, “02”, “03”, …
' Ciclo que insere 50 itens
For x As Byte = 0 To 49
Me.ComboBox2.Items.Add("Item " & x.ToString.PadLeft(2, "0"))
Next
São pequenos exemplos que pretendem apenas mostrar alguma alternativas de inserir dados em modo run-time à ComboBox, em especial com a utilização de uma base de dados em Access como fonte de dados.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
13 comentários:
Olá amigo estou com uma dificuldade no seguinte código para preencher um combobox com o resultado da select, o problema é que ele só me traz o 1 registro. Acredito que "additem" não é a solução correta. poderia me ajudar?
VB6.0 / SQL2000
Dim rslocaliza As rdoResultset
vssql = "SELECT nome,documento FROM visitantes order by nome"
Set rslocaliza = db.OpenResultset(vssql, rdOpenStatic)
Combo1.Clear
Combo1.AddItem IIf(IsNull(rslocaliza!nome), "", rslocaliza!nome)
Abraços Fernando
olha amigo eu nao estou conseguindo indicar o path da base de dados,.criei minha base de dados no access e careguei para meu disco c.estarei num caminho certo?quando corro o projecto ele me da o seguinte erro:could not find file C:\dados.mdb;
obrigado
Olá mundinho!
Tens de mostrar o código que usaste. Podes, se quiseres, colocar a questão no fórum onde sou moderador, pois lá tens mais pessoas que podem ajudar.
Olá. Estou usando um comboBox no meu prjeto do navegador, mas aí nele só consegue abrir os sites que estão dentro da coleção de ítens, e quero que navegue em sites que não estejam lá. Uso um código que vi numa vídeo-aula da MS, mas essa parte é que está algo que tentei bilhares de vezes mas deu erro -.- . Eis o código : "(new Uri(comboBox1.SelectedItem.ToString()));" (sem aspas). Tem como ajudar?
Olá,
Tem de mostrar mais código. Se possível coloque a sua dúvida, com código, em www.portugal-a-programar.org
Amigo é o seguinte tive a ver o seu topico, num projecto meu consigo colocar strings numa ComboBox, so nao consigo associar essas strings a valores da base de dados....
Precisava disso para fazer calculos...
Olá, boa tarde,
Como faço para inserir um item ao campobox depois de ele ter sido preenchido com um datasouce ?
Será possível ?
Obrigado
César Oliveira
É exactamente o que está no artigo:
' Insere um novo item geral na posição 0
' com uma descrição geral a indicar o tipo de lista
Dim dr As DataRow
dr = ds.Tables(0).NewRow
dr.Item("id") = 0
dr.Item("vendedor") = "Lista Vendedores"
ds.Tables(0).Rows.InsertAt(dr, 0)
Muito obrigado
Consegui fazer
Cumprimentos
César Oliveira
Boa tarde, gostaria de saber qual o código devo utilizar para que uma ComboBox quando mostra os valores da linha e coluna destinada, não mostre várias vezes a mesma palavra, por exemplo
na tabela qe tenho num form escrevo 2 ou mais vezes a palavra ou conjunto de palavras "base de dados", existem várias linhas com essa palavra, na textbox, aparecerá várias vezes a palavra repetida, e eu não queria isso...
e eu ao clicar na primeira combobox com a palavra destinada, noutra combobox deverá aparecer os restantes itens...
Por exemplo, na tabela:
1ª linha:
primeira coluna: base de dados
segunda coluna: trabalhos
2ª linha:
primeira coluna: base de dados
segunda coluna: projectos
3ª linha:
primeira coluna: escola
segunda coluna: trabalhos1
4ª linha:
primeira coluna: escola
segunda coluna: projectos1
ou seja, na primeira combobox só deverá aparecer 1 vez a dizer base de dados e 1 vez a dizer escola, e quando clico na combobox em base de dados na combobox2 deverá aparecer trabalhos e projectos, se clicar em escola, na combobox 2 deverá aparecer trabalho1 e projectos1
Olá,
Coloque a questão na comunidade Portugal-a-Programar e mostre o código actual.
Muito bom este artigo.
No entanto tenho que te colocar uma dúvida, pois utilizei o teu código para dados numéricos, ou seja, faço uma ligação a uma tabela que tem uma coluna numérica do tipo int e não consigo que o registo 0 (zero) fique com a frase tipo, "Insira N.º" ou que fique simplesmente em branco.
Outra questão tem a ver com os parametros passados. E se for um número, tipo se tiver um campo tipo status (bit) que toma dois valores, 0 ou 1?
Sub CarregaNumeros()
Try
Dim connString As String = "Data Source=PC;Initial Catalog=Parque;Persist Security Info=True;User ID=sa;Password=Teste"
' Inicia uma ligação à base de dados
Using connection As New SqlConnection(connString)
' Select Statement que irá mostrar todos os funcionarios activos,
' excepto o funcionario que será definido no parâmetro
Dim SQL As String = "select * from Funcionarios where Status <> 0"
' Define o DataAdapter e os parâmetros. O DataAdapter guarda a ligação, não
' sendo necessário abrir com o comando connection.Open()
Dim da As New SqlDataAdapter(SQL, connection)
'da.SelectCommand.Parameters.Add("Satus", SqlDbType.Bit).Value = 1
'da.SelectCommand.Parameters.Add("Nome", SqlDbType.VarChar).Value = "Jorge Paulino"
' Preenche o Dataset com os valores da base de dados
Dim ds As New DataSet
da.Fill(ds)
' Preenche a combobox
With Me.ComboBoxNumero
.DisplayMember = "Numero"
.ValueMember = "ID_Funcionaio"
.DataSource = ds.Tables(0).DefaultView
' Definições para autocomplete
.DropDownStyle = ComboBoxStyle.DropDown
.AutoCompleteMode = AutoCompleteMode.Suggest
.AutoCompleteSource = AutoCompleteSource.ListItems
End With
' Insere um novo item geral na posição 0
' com uma descrição geral a indicar o tipo de lista
Dim dr As DataRow
dr = ds.Tables(0).NewRow
dr.Item("Numero") = 0
'dr.Item("Numero") = "Numero Funcionario"
ds.Tables(0).Rows.InsertAt(dr, 0)
'Selecciona o item inserido
Me.ComboBoxNumero.SelectedIndex = 0
End Using
Catch ex As Exception
MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class
Obrigado
No meu caso, substitui o:
"FindString" por:
"FindStringExact", pois por exemplo, temos um nome que é: João Silva Rodrigues e a pessoa escreve à mão na combobox apenas "João Silva", o que acontecia é que como ele de facto encontra uma string "João Silva" passava a validação e assumia um index null, inserindo "" na BD.
Enviar um comentário