ITEMDATA NO COMBOBOX
================================================
- Criei um ComboBox (“cboGeneroâ€) no meu Form assim:
================================================
private void frm_Load(object sender, EventArgs e)
{
cboGenero.ValueMember = [Ô]Codigo[Ô];
cboGenero.DropDownStyle = ComboBoxStyle.DropDownList;
CarregaCombo();
}
private void CarregaCombo()
{
//comunicação com a camada BLL
clsGeneroBLL obj = new clsGeneroBLL();
//aqui preenche o DataSource com uma chamada a Stored Procedure de um SQL Express.
cboGenero.DataSource = obj.Listagem(txtFiltro.Text, SCA);
}
================================================
O exemplo que peguei aqui não funcona para trabalhar com “DataSourceâ€. [Ô]ITEMDATA NO COMBOBOX COM STRUCT[Ô] de CLEVERTON.
Quando eu chamo o “Menu Watch†com o termo: “cboGenero.SelectedValueâ€, dentro dele (clicando em “+â€) aparece em cboGenero.SelectedValue.Row.ItemArray[0] o valor do código “PK†que eu quero... mas não consigo colocar este caminho (.Row.ItemArray[0]) no código.
Como faço para recuperar a informação que está dentro da combobox (não quero o texto, mas o código de “ValueMemberâ€) – “ItemArray[0]â€?
Pois se o usuário mudar o “gênero†escolhido, preciso passar a FK para o banco de volta.
================================================
- Criei um ComboBox (“cboGeneroâ€) no meu Form assim:
================================================
private void frm_Load(object sender, EventArgs e)
{
cboGenero.ValueMember = [Ô]Codigo[Ô];
cboGenero.DropDownStyle = ComboBoxStyle.DropDownList;
CarregaCombo();
}
private void CarregaCombo()
{
//comunicação com a camada BLL
clsGeneroBLL obj = new clsGeneroBLL();
//aqui preenche o DataSource com uma chamada a Stored Procedure de um SQL Express.
cboGenero.DataSource = obj.Listagem(txtFiltro.Text, SCA);
}
================================================
O exemplo que peguei aqui não funcona para trabalhar com “DataSourceâ€. [Ô]ITEMDATA NO COMBOBOX COM STRUCT[Ô] de CLEVERTON.
Quando eu chamo o “Menu Watch†com o termo: “cboGenero.SelectedValueâ€, dentro dele (clicando em “+â€) aparece em cboGenero.SelectedValue.Row.ItemArray[0] o valor do código “PK†que eu quero... mas não consigo colocar este caminho (.Row.ItemArray[0]) no código.
Como faço para recuperar a informação que está dentro da combobox (não quero o texto, mas o código de “ValueMemberâ€) – “ItemArray[0]â€?
Pois se o usuário mudar o “gênero†escolhido, preciso passar a FK para o banco de volta.
================================================
Já tentou o código [txt-color=#0000f0]cboGenero.SelectedValue.ToString()[/txt-color]?
Tecla,
Sim, experimentei o [Ô]cboGenero.SelectedValue.ToString();[Ô]
Ele me mostra o [Ô]Erro: Input string was not in a correct format.[Ô]
===========================
animal.CodigoGenero = Convert.ToInt32(cboGenero.SelectedValue.ToString());
===========================
No menu Watch aparece como [Ô]System.Data.DataRowView[Ô] - string.
Na lista de propriedade eu coloquei:
---------------------------
cboGenero.ValueMember = [Ô]Codigo[Ô];
cboGenero.DropDownStyle = ComboBoxStyle.DropDownList;
---------------------------
Printei a tela e anexei aqui.
Eu quero recuperar a Chave Primária (PK - Primary Key). é interessante que a informação está dentro da combo visualizando pelo menu Watch!
Mas como recuperá-la (readOnly)?!? Quando peço o Intelisense ([Ô].[Ô]) não aparece na lista!
Valew!
Sim, experimentei o [Ô]cboGenero.SelectedValue.ToString();[Ô]
Ele me mostra o [Ô]Erro: Input string was not in a correct format.[Ô]
===========================
animal.CodigoGenero = Convert.ToInt32(cboGenero.SelectedValue.ToString());
===========================
No menu Watch aparece como [Ô]System.Data.DataRowView[Ô] - string.
Na lista de propriedade eu coloquei:
---------------------------
cboGenero.ValueMember = [Ô]Codigo[Ô];
cboGenero.DropDownStyle = ComboBoxStyle.DropDownList;
---------------------------
Printei a tela e anexei aqui.
Eu quero recuperar a Chave Primária (PK - Primary Key). é interessante que a informação está dentro da combo visualizando pelo menu Watch!
Mas como recuperá-la (readOnly)?!? Quando peço o Intelisense ([Ô].[Ô]) não aparece na lista!
Valew!
private void frm_Load(object sender, EventArgs e)
{
cboGenero.DropDownStyle = ComboBoxStyle.DropDownList;
DataTable dt = new DataTable();
clsGeneroBLL obj = new clsGeneroBLL();
dt = obj.Listagem(SCA);
cboGenero.DataSource = dt;
cboGenero.DisplayMember = [Ô]Nome[Ô];
cboGenero.ValueMember = [Ô]Codigo[Ô];
cboGenero.DataBindings.Add([Ô]SelectedValue[Ô], dt, [Ô]Codigo[Ô]);
}
//Na classe eu não sei como que esta sua função, mas essa abaixo é um exemplo com retorno DataTble
Public DataTable Function Listagem(String nomeProcedure){
DataTable dt = New DataTable();
SqlCommand cmd = new SqlCommand(nomeProcedure, SuaConexao);
cmd.CommandType = CommandType.StoredProcedure;
SuaConexao.Open();
SqlDataAdapter da = New SqlDataAdapter(cmd);
da.Fill(dt);
return dt
}
Cara faz um teste as vezes da uma luz
FILMAN,
Sim, é por ai, mas agora eu quero recuperar o valor [Ô]Value Member[Ô] da ComboBox para poder fazer um INSERT na base de dados atualizando a informação.
Exemplo:
- O Usuário clicou no botão [Ô]Alterar[Ô], mudou o valor da ComboBox e agora quer [Ô]salvar[Ô].
Muito bem! Agora preciso gravar na base de dados o valor da Chave Primária (PK - Primary Key) que está dentro do [Ô]Value Member[Ô], pois ela é Chave Estrangeira (FK - Foreign Key) no relacionamento entre tabelas.
A informação está dentro da ComboBox com certeza (veja a imagem que aneixei acima). Mas como recuperar esta informação? Será que precisarei fazer uma nova leitura da base de dados somente para isto? Um absurdo, não acha?
Engraçado é que montei um sistema que a combo funcionava... não sei o que fiz que esta não está aceitando.
-------------------------------------------
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando STORED PROCEDURE.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLExpress(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLExpress;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = [Ô]sca.dbo.seleciona_genero[Ô];
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//parâmetros da stored procedure
SqlParameter pfiltro;
pfiltro = da.SelectCommand.Parameters.Add([Ô]@filtro[Ô], SqlDbType.Text);
pfiltro.Value = filtro;
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
-------------------------------------------
***** STORED PROCEDURE
-------------------------------------------
USE [SCA]
GO
/****** Object: StoredProcedure [dbo].[seleciona_genero] Script Date: 01/16/2013 13:59:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Autor,,Nome>
-- Create date: <02/01/2013>
-- Description: <Descrição>
-- =============================================
ALTER PROCEDURE [dbo].[seleciona_genero]
-- Add the parameters for the stored procedure here
@filtro nvarchar(100) = NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
IF @filtro IS NULL
SELECT * FROM SCA.dbo.tblGeneros
ELSE
SELECT * FROM SCA.dbo.tblGeneros
WHERE Nome like [ô]%[ô] + @filtro + [ô]%[ô]
END
-------------------------------------------
[][ô]s,
Tunusat.
Sim, é por ai, mas agora eu quero recuperar o valor [Ô]Value Member[Ô] da ComboBox para poder fazer um INSERT na base de dados atualizando a informação.
Exemplo:
- O Usuário clicou no botão [Ô]Alterar[Ô], mudou o valor da ComboBox e agora quer [Ô]salvar[Ô].
Muito bem! Agora preciso gravar na base de dados o valor da Chave Primária (PK - Primary Key) que está dentro do [Ô]Value Member[Ô], pois ela é Chave Estrangeira (FK - Foreign Key) no relacionamento entre tabelas.
A informação está dentro da ComboBox com certeza (veja a imagem que aneixei acima). Mas como recuperar esta informação? Será que precisarei fazer uma nova leitura da base de dados somente para isto? Um absurdo, não acha?
Engraçado é que montei um sistema que a combo funcionava... não sei o que fiz que esta não está aceitando.
-------------------------------------------
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando STORED PROCEDURE.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLExpress(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLExpress;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = [Ô]sca.dbo.seleciona_genero[Ô];
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//parâmetros da stored procedure
SqlParameter pfiltro;
pfiltro = da.SelectCommand.Parameters.Add([Ô]@filtro[Ô], SqlDbType.Text);
pfiltro.Value = filtro;
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
-------------------------------------------
***** STORED PROCEDURE
-------------------------------------------
USE [SCA]
GO
/****** Object: StoredProcedure [dbo].[seleciona_genero] Script Date: 01/16/2013 13:59:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Autor,,Nome>
-- Create date: <02/01/2013>
-- Description: <Descrição>
-- =============================================
ALTER PROCEDURE [dbo].[seleciona_genero]
-- Add the parameters for the stored procedure here
@filtro nvarchar(100) = NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
IF @filtro IS NULL
SELECT * FROM SCA.dbo.tblGeneros
ELSE
SELECT * FROM SCA.dbo.tblGeneros
WHERE Nome like [ô]%[ô] + @filtro + [ô]%[ô]
END
-------------------------------------------
[][ô]s,
Tunusat.
Como você esta tentando recuperar o valor da combo?
int codigo = combobox.SelectValue;
Tentou colocar outro combobox e fazer os testes com ele?
Já colocou assim ao carregar o combo
int codigo = combobox.SelectValue;
Tentou colocar outro combobox e fazer os testes com ele?
Já colocou assim ao carregar o combo
ComboBox1.DataBindings.Add([Ô]SelectedValue[Ô], dt, [Ô]ID[Ô], true);
ComboBox1.DataSource = dt;
ComboBox1.DisplayMember = [Ô]Descricao[Ô];
ComboBox1.ValueMember = [Ô]ID[Ô];
FILMAN,
Carrego a combo assim (3 camadas):
==================================
No Form:
==================================
private void CarregaCombo()
{
//comunicação com a camada BLL
clsGeneroBLL obj = new clsGeneroBLL();
//Se eu fizer desta forma, não consigo recuperar o código depois.
cboGenero.DataSource = obj.Listagem(txtFiltro.Text, SCA);
}
==================================
Camada de Negócios (Nota: Talvez seja melhor colocar aqui a escolha do Banco que devo acessar):
==================================
/// <summary>
/// Retorna uma lista de registros que foram encontrados na busca
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <param name=[Ô]SCA[Ô]>Classe de Ambiente do Sistema</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
public DataTable Listagem(string filtro, clsSCA SCA)
{
DataTable dtListagem = new DataTable();
clsGeneroDAL obj = new clsGeneroDAL();
dtListagem = obj.Listagem(filtro, SCA);
//Neste Ponto coloco a lista em um ArrayList para o Model
return dtListagem;
}
==================================
Camada Banco de Dado (dois passos) – Estou usando somente o SQL Express:
==================================
public DataTable Listagem(string filtro, clsSCA SCA)
{
DataTable listagem = new DataTable();
if (SCA.Banco == [Ô]A[Ô])
{
listagem = ListagemAccess(filtro);
}
else if (SCA.Banco == [Ô]X[Ô])
{
listagem = ListagemSQLExpress(filtro);
}
else if (SCA.Banco == [Ô]C[Ô])
{
listagem = ListagemSQLCompact(filtro);
}
return listagem;
}
==================================
/// <summary>
/// Este é o listagem Gênero do Access
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemAccess(string filtro)
{
OleDbConnection cn = new OleDbConnection();
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoAccess;
//adapter
da.SelectCommand = new OleDbCommand();
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.Text;
//SQL
if (filtro == [Ô][Ô])
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM Genero[Ô];
}
else
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM Genero [Ô] +
[Ô]WHERE nome like [ô]%[Ô] + filtro;
}
da.Fill(dt);
return dt;
}
catch (OleDbException ex)
{
throw new Exception([Ô]Erro no Access: [Ô] + ex.ErrorCode);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando STORED PROCEDURE.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLExpress(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLExpress;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = [Ô]sca.dbo.seleciona_genero[Ô];
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//parâmetros da stored procedure
SqlParameter pfiltro;
pfiltro = da.SelectCommand.Parameters.Add([Ô]@filtro[Ô], SqlDbType.Text);
pfiltro.Value = filtro;
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando TEXT.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLCompact(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLCompact;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.Text;
//SQL
if (filtro == [Ô][Ô])
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM tblGenero[Ô];
}
else
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM tblGenero [Ô] +
[Ô]WHERE nome like [ô]%[Ô] + filtro;
}
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
Na verdade o conteúdo desta “clsDados†deveria ser colocada em um arquivo “app.configâ€.
[]’s,
Tunusat.
Carrego a combo assim (3 camadas):
==================================
No Form:
==================================
private void CarregaCombo()
{
//comunicação com a camada BLL
clsGeneroBLL obj = new clsGeneroBLL();
//Se eu fizer desta forma, não consigo recuperar o código depois.
cboGenero.DataSource = obj.Listagem(txtFiltro.Text, SCA);
}
==================================
Camada de Negócios (Nota: Talvez seja melhor colocar aqui a escolha do Banco que devo acessar):
==================================
/// <summary>
/// Retorna uma lista de registros que foram encontrados na busca
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <param name=[Ô]SCA[Ô]>Classe de Ambiente do Sistema</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
public DataTable Listagem(string filtro, clsSCA SCA)
{
DataTable dtListagem = new DataTable();
clsGeneroDAL obj = new clsGeneroDAL();
dtListagem = obj.Listagem(filtro, SCA);
//Neste Ponto coloco a lista em um ArrayList para o Model
return dtListagem;
}
==================================
Camada Banco de Dado (dois passos) – Estou usando somente o SQL Express:
==================================
public DataTable Listagem(string filtro, clsSCA SCA)
{
DataTable listagem = new DataTable();
if (SCA.Banco == [Ô]A[Ô])
{
listagem = ListagemAccess(filtro);
}
else if (SCA.Banco == [Ô]X[Ô])
{
listagem = ListagemSQLExpress(filtro);
}
else if (SCA.Banco == [Ô]C[Ô])
{
listagem = ListagemSQLCompact(filtro);
}
return listagem;
}
==================================
/// <summary>
/// Este é o listagem Gênero do Access
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemAccess(string filtro)
{
OleDbConnection cn = new OleDbConnection();
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoAccess;
//adapter
da.SelectCommand = new OleDbCommand();
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.Text;
//SQL
if (filtro == [Ô][Ô])
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM Genero[Ô];
}
else
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM Genero [Ô] +
[Ô]WHERE nome like [ô]%[Ô] + filtro;
}
da.Fill(dt);
return dt;
}
catch (OleDbException ex)
{
throw new Exception([Ô]Erro no Access: [Ô] + ex.ErrorCode);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando STORED PROCEDURE.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLExpress(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLExpress;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = [Ô]sca.dbo.seleciona_genero[Ô];
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//parâmetros da stored procedure
SqlParameter pfiltro;
pfiltro = da.SelectCommand.Parameters.Add([Ô]@filtro[Ô], SqlDbType.Text);
pfiltro.Value = filtro;
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
/// <summary>
/// Este é o listagem Gênero do SQL Server. Está usando TEXT.
/// </summary>
/// <param name=[Ô]filtro[Ô]>Palavra a ser buscada dentro do nome e das notas</param>
/// <returns>Retorna uma lista de registros que foram encontrados na busca</returns>
private DataTable ListagemSQLCompact(string filtro)
{
SqlConnection cn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
try
{
cn.ConnectionString = clsDados.StringDeConexaoSQLCompact;
//adapter
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = cn;
da.SelectCommand.CommandType = CommandType.Text;
//SQL
if (filtro == [Ô][Ô])
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM tblGenero[Ô];
}
else
{
da.SelectCommand.CommandText = [Ô]SELECT * FROM tblGenero [Ô] +
[Ô]WHERE nome like [ô]%[Ô] + filtro;
}
da.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
cn.Close();
}
}
==================================
Na verdade o conteúdo desta “clsDados†deveria ser colocada em um arquivo “app.configâ€.
[]’s,
Tunusat.
PessoALL,
A solução do CLEVERTON meu ajudou a entender o problema:
http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=8645
[][ô]s,
Tunusat.
A solução do CLEVERTON meu ajudou a entender o problema:
http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=8645
[][ô]s,
Tunusat.
Tópico encerrado , respostas não são mais permitidas