ITEMDATA NO COMBOBOX

TUNUSAT 09/01/2013 20:56:35
#417071
================================================

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

================================================
TECLA 12/01/2013 14:09:37
#417259
Já tentou o código [txt-color=#0000f0]cboGenero.SelectedValue.ToString()[/txt-color]?
TUNUSAT 14/01/2013 23:14:52
#417361
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!
FILMAN 15/01/2013 00:24:44
#417364
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
TUNUSAT 16/01/2013 19:47:09
#417534
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.
FILMAN 16/01/2013 20:58:23
#417545
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

ComboBox1.DataBindings.Add([Ô]SelectedValue[Ô], dt, [Ô]ID[Ô], true);
ComboBox1.DataSource = dt;
ComboBox1.DisplayMember = [Ô]Descricao[Ô];
ComboBox1.ValueMember = [Ô]ID[Ô];



TUNUSAT 17/01/2013 21:36:12
#417660
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.
TUNUSAT 16/09/2013 13:21:42
#428897
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.
Tópico encerrado , respostas não são mais permitidas