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: Utilizando o controlo ComboBox

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.Load

        Try

            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 = 0 

            End 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 If 

    End 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:

Fernando Forenza disse...

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

mundinho disse...

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

Jorge Paulino disse...

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.

Fábio L. M. disse...

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?

Jorge Paulino disse...

Olá,

Tem de mostrar mais código. Se possível coloque a sua dúvida, com código, em www.portugal-a-programar.org

João Nascimento disse...

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...

Unknown disse...

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

Jorge Paulino disse...

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

Unknown disse...

Muito obrigado

Consegui fazer

Cumprimentos

César Oliveira

FlavioJesus disse...

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

Jorge Paulino disse...

Olá,

Coloque a questão na comunidade Portugal-a-Programar e mostre o código actual.

Unknown disse...

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

João Rodrigues disse...

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.



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico