A ComboBox é uns dos componentes mais utilizando no nosso dia a dia seja em uma aplicação Windows Form ou Web Form(DropDownList) , participando dos fóruns da MSDN percebi que muitas threads são criadas com perguntas de como concatenar duas colunas e mostrar ,como descobrir qual registro foi selecionado e fazer uma busca no banco de dados etc...
Muitas dessas dúvidas podem ser resolvidas utilizando uma pratica simples , consiste em criar um objeto e usar esse objeto com item da ComboBox , fazendo isso você ganha em flexibilidade e pode fazer validações ,concatenações,operações ,pode guarda N dados , enfim você tem o controle total do que será exibido e guardado na sua ComboBox utilizando essa prática .
Criando o seu objeto com as propriedades e ações necessárias para atender a sua necessidade, você também ganha desempenho trabalhando desconectado do banco de dados e sem a necessidade de criar DataSet.
O ponto chave dessa prática e sobrescrever o método ToString do objeto esse método e chamado na hora em que o a propriedade Text da ComboBox for preenchida como o método ToString retorna uma string qualquer valor que você retorna será exibido na ComboBox , assim você pode concatenar N valores e fazer verificações para decidir o que mostrar .
Recursos utilizados:
- Visual Studio 2008 Express Edition
- Microsoft SQL Server 2005 Express Edition
- Banco de dados de exemplo Northwind
Primeiro passo : Criar um formulário como base na imagem abaixo :

Segundo passo : Criar o objeto que será utilizando como item para o preenchimento da ComboBox.
public class ExemploObjeto
{
public string CustomerID { get; set; }
public string CompanyName { get; set; }
public string ContactName { get; set; }
public string ContactTitle { get; set; }
public string Address { get; set; }
///
/// Sobrescrever método ToString e retorno o valor que será exibido na combos
///
///
public override string ToString()
{
return String.Format("Companhia : {0} - Contato : {0}", this.CompanyName, this.ContactName);
}
}
Public Class ExemploObjeto
Private _customerID As String
Private _companyName As String
Private _contactName As String
Private _contactTitle As String
Private _address As String
Public Property CustomerID() As String
Get
Return _customerID
End Get
Set(ByVal value As String)
_customerID = value
End Set
End Property
Public Property CompanyName() As String
Get
Return _companyName
End Get
Set(ByVal value As String)
_companyName = value
End Set
End Property
Public Property ContactName() As String
Get
Return _contactName
End Get
Set(ByVal value As String)
_contactName = value
End Set
End Property
Public Property ContactTitle() As String
Get
Return _contactTitle
End Get
Set(ByVal value As String)
_contactTitle = value
End Set
End Property
Public Property Address() As String
Get
Return _address
End Get
Set(ByVal value As String)
_address = value
End Set
End Property
Public Overrides Function ToString() As String
Return String.Format("Companhia : {0} - Contato : {0}", Me.CompanyName, Me.ContactName)
End Function
End Class
Terceiro passo : Preenche a ComboBox com o objeto criado no segundo passo.
private void PreencheComboBox()
{
ExemploObjeto exemploObjeto = null;
try
{
using (SqlConnection connection = new SqlConnection(Settings.Default.NorthwindConnectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "SELECT CustomerID,CompanyName,ContactName ,ContactTitle ,Address FROM Customers";
command.Connection = connection;
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
//Preenche ComboBox
while (reader.Read())
{
//Cria Objeto que será Source para Combo
exemploObjeto = new ExemploObjeto();
exemploObjeto.CustomerID = reader.GetString(reader.GetOrdinal("CustomerID"));
exemploObjeto.CompanyName = reader.GetString(reader.GetOrdinal("CompanyName"));
exemploObjeto.ContactName = reader.GetString(reader.GetOrdinal("ContactName"));
exemploObjeto.ContactTitle = reader.GetString(reader.GetOrdinal("ContactTitle"));
exemploObjeto.Address = reader.GetString(reader.GetOrdinal("Address"));
//Adiciona objeto a Combo
comboBoxCustomers.Items.Add(exemploObjeto);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Private Sub PreencheComboBox()
Dim objExemploObjeto As ExemploObjeto = Nothing
Try
Using connection As New SqlConnection(Settings.Default.NorthwindConnectionString)
Using command As New SqlCommand()
command.CommandText = "SELECT CustomerID,CompanyName,ContactName ,ContactTitle ,Address FROM Customers"
command.Connection = connection
connection.Open()
Using reader As SqlDataReader = command.ExecuteReader()
'Preenche ComboBox
While (reader.Read())
'Cria Objeto que será Source para Combo
objExemploObjeto = New ExemploObjeto()
objExemploObjeto.CustomerID = reader.GetString(reader.GetOrdinal("CustomerID"))
objExemploObjeto.CompanyName = reader.GetString(reader.GetOrdinal("CompanyName"))
objExemploObjeto.ContactName = reader.GetString(reader.GetOrdinal("ContactName"))
objExemploObjeto.ContactTitle = reader.GetString(reader.GetOrdinal("ContactTitle"))
objExemploObjeto.Address = reader.GetString(reader.GetOrdinal("Address"))
'Adiciona objeto a Combo
comboBoxCustomers.Items.Add(objExemploObjeto)
End While
End Using
End Using
End Using
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Quarto passo : Recuperar o item adicionado, existe varias maneiras de fazer isso, mais na minha opinião a melhor forma de se fazer isso é no evento SelectedIndexChanged utilizar a propriedade SelectedItem que retorna o objeto selecionado.
private void comboBoxCustomers_SelectedIndexChanged(object sender, EventArgs e)
{
//Carrega objeto selecionado
ExemploObjeto exemploObjeto = (ExemploObjeto)comboBoxCustomers.SelectedItem;
//Mostra os valores das propriedades do item selecionado
textBoxId.Text = exemploObjeto.CustomerID;
textBoxCompanhia.Text = exemploObjeto.CompanyName;
textBoxContato.Text = exemploObjeto.ContactName;
textBoxCargoContato.Text = exemploObjeto.ContactTitle;
textBoxEndereco.Text = exemploObjeto.Address;
}
Private Sub comboBoxCustomers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles comboBoxCustomers.SelectedIndexChanged
'Carrega objeto selecionado
Dim objExemploObjeto As ExemploObjeto = comboBoxCustomers.SelectedItem
'Mostra os valores das propriedades do item selecionado
textBoxId.Text = objExemploObjeto.CustomerID
textBoxCompanhia.Text = objExemploObjeto.CompanyName
textBoxContato.Text = objExemploObjeto.ContactName
textBoxCargoContato.Text = objExemploObjeto.ContactTitle
textBoxEndereco.Text = objExemploObjeto.Address
End Sub
Conclusão
Esse é um exemplo do que pode ser feito com a utilização dessa prática , dessa forma você ganha muita flexibilidade e pode melhorar a performance dos seus aplicativos trabalhando de forma desconectada do banco .
Código Fonte
Daniel Fonseca Castro