Jump to content
nando4

C# Diferenciar dois nomes iguais numa ListBox

Recommended Posts

nando4

Boas

Eu estou a fazer um software de gestão e estou a listar os clientes existentes numa BD numa listbox e ao seleccionar um cliente da listbox preenche automaticamente os campos abaixo mas se um cliente tiver o mesmo nome os campos nao preenchem de acordo com o cliente seleccionado.

A minha duvida é se existe alguma maneira de diferenciar os dois clientes.

Cumps

Share this post


Link to post
Share on other sites
Tiago Salgado

Talvez pelo seu código de cliente?

Como é que adicionas os items na Listbox? Cada item é um ListItem, em que poderás indicar o Value (código de cliente) e o Text (Nome do Cliente).

Para preencher os dados de cada um dos clientes, usas o seu código de cliente para retornar a informação, e não o nome.

Share this post


Link to post
Share on other sites
nando4

Não sei se percebi o que querias dizer, o codigo que estou a usar é o seguinte:

private void LoadCliente()
        {
            liga.Open();

            SqlCommand cmd = new SqlCommand("SELECT * FROM clientes",liga);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                lb_clientes.Items.Add(dr["nome"]);
            }

            liga.Close();
        }

Cumps

Share this post


Link to post
Share on other sites
Tiago Salgado

Podes alterar para:

private void LoadCliente()
        {
            liga.Open();

            SqlCommand cmd = new SqlCommand("SELECT * FROM clientes",liga);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                lb_clientes.Items.Add(new ListItem(dr["codigo_Cliente"].ToString(),dr["nome"].ToString()));
            }

            liga.Close();
        }

Depois para preencheres os dados do cliente, vais à base de dados usando como parametro o valor da listbox. Algo como

// ligar à BD bla bla bla
using(SqlCommand cmd = new SqlCommand(@"SELECT * FROM Dados_Do_Cliente WHERE codigoCliente =@codigo"))
{
    cmd.Parameters.Add("@codigo",SqlDbType.Int,4).Value = Convert.ToInt32(lb_clientes.SelectedValue);
    // resto do código etc etc etc
}

Share this post


Link to post
Share on other sites
nando4

O visual studio não reconhece o ListItem

ERRO: The type or namespace name 'ListItem' could not be found (are you missing a using directive or an assembly reference?)

Cumps

Share this post


Link to post
Share on other sites
vesteves

Tem também a hipótese de, caso use um objecto para representar os dados que extrai da BD, adicionar os mesmos directamente na ListBox, fazendo override ao método ToString() desses objectos para devolver apenas o nome do cliente. Desta forma, tem acesso ao objecto como um todo, e logo aos respectivos dados.

Cumprimentos,

Virgílio

Share this post


Link to post
Share on other sites
vesteves

No objecto que criar para representar cada entrada extraida da BD, basta fazer:

public override string ToString ()
{
// Tendo em conta que esta variável seria o local onde estaria a informação a apresentar.
return this.m_name;
}

Cumprimentos,

Virgílio

Share this post


Link to post
Share on other sites
nando4

Podes alterar para:

private void LoadCliente()
        {
            liga.Open();

            SqlCommand cmd = new SqlCommand("SELECT * FROM clientes",liga);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                lb_clientes.Items.Add(new ListItem(dr["codigo_Cliente"].ToString(),dr["nome"].ToString()));
            }

            liga.Close();
        }

Depois para preencheres os dados do cliente, vais à base de dados usando como parametro o valor da listbox. Algo como

// ligar à BD bla bla bla
using(SqlCommand cmd = new SqlCommand(@"SELECT * FROM Dados_Do_Cliente WHERE codigoCliente =@codigo"))
{
    cmd.Parameters.Add("@codigo",SqlDbType.Int,4).Value = Convert.ToInt32(lb_clientes.SelectedValue);
    // resto do código etc etc etc
}

Já agora tenho que adicionar isto primeiro?

using System.Web.UI.Design.WebControls;

Cumps

Share this post


Link to post
Share on other sites
nando4

Já resolvi.

Primeiro fiz:

//coleçao de clientes
List<Cliente> listaClientes;

Ao carregar os clientes fiz:

private void LoadCliente()
        {
            liga.Open();

            listaClientes = new List<Cliente>();

            SqlCommand cmd = new SqlCommand("SELECT id_cliente, nome FROM clientes", liga);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                listaClientes.Add(new Cliente() { Id = Convert.ToInt32(dr["id_cliente"]), Nome = Convert.ToString(dr["nome"]) });
                
            }

            lb_clientes.DisplayMember = "Nome";
            lb_clientes.ValueMember = "Id";
            lb_clientes.DataSource = listaClientes;
            liga.Close();
        }

E depois quando o user seleciona o cliente:

private void SelecCliente()
        {
            liga.Open();

            lb_clientes.DisplayMember = "Nome";
            lb_clientes.ValueMember = "Id";
            lb_clientes.DataSource = listaClientes;

            //cod_postal
            SqlCommand cmd1 = new SqlCommand("SELECT id_cod_postal FROM clientes WHERE id_cliente = '" + lb_clientes.SelectedValue + "'", liga);
            Int32 id_codpostal = (Int32)cmd1.ExecuteScalar();

            SqlCommand cmd2 = new SqlCommand("SELECT cod_postal FROM cod_postal WHERE id_cod_postal = '" + id_codpostal + "'", liga);
            String cod_postal = (String)cmd2.ExecuteScalar();

            SqlCommand cmd3 = new SqlCommand("SELECT localidade FROM cod_postal WHERE id_cod_postal = '" + id_codpostal + "'", liga);
            String local = (String)cmd3.ExecuteScalar();
            //

            //tipo_cliente
            SqlCommand cmd4 = new SqlCommand("SELECT id_tipo_cliente FROM clientes WHERE id_cliente='" + lb_clientes.SelectedValue + "'", liga);
            Int32 id_tipo = (Int32)cmd4.ExecuteScalar();

            SqlCommand cmd5 = new SqlCommand("SELECT nome_tipo_cliente FROM tipo_cliente WHERE id_tipo_cliente = '" + id_tipo + "'", liga);
            String tipo_cliente = (String)cmd5.ExecuteScalar();
            //

            SqlCommand cmd = new SqlCommand("SELECT * FROM clientes WHERE id_cliente = '" + lb_clientes.SelectedValue + "' ", liga);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {

                tb_nome.Text = Convert.ToString(dr["nome"]);
                tb_telefonep.Text = Convert.ToString(dr["telefone_p"]);
                tb_telefonet.Text = Convert.ToString(dr["telefone_t"]);
                tb_telemovelp.Text = Convert.ToString(dr["telemovel_p"]);
                tb_telemovelt.Text = Convert.ToString(dr["telemovel_t"]);
                tb_email.Text = Convert.ToString(dr["email"]);
                tb_fax.Text = Convert.ToString(dr["fax"]);
                tb_bi.Text = Convert.ToString(dr["bi"]);
                tb_nib.Text = Convert.ToString(dr["nib"]);
                tb_nif.Text = Convert.ToString(dr["nif"]);
                tb_localidade.Text = local;
                tb_codpostal.Text = cod_postal;
                tb_criado_em.Text = Convert.ToString(dr["criado_em"]);
                tb_notas.Text = Convert.ToString(dr["notas_cliente"]);
                tb_tipo_cliente.Text = tipo_cliente;
            }

            liga.Close();
        }

Cumps

Share this post


Link to post
Share on other sites
nando4

Mas agora tenho um problema, nao consigo limpar a listBox, dantes usava o comando:

listBox1.Items.Clear();

Mas agora da erro, diz que nao consegue limpar os dados se a propriedade DataSource estiver definida.

Cumps

Share this post


Link to post
Share on other sites
nando4

Não tenho a certeza se é assim que se remove a DataSource, mas não funcionou:

lb_clientes.DataSource = null;

Cumps

Share this post


Link to post
Share on other sites
nando4

Resolvido  :thumbsup:

Fiz:

lb_clientes.DataSource = new List<Cliente>();

Obrigado na mesma  :(

Cumps

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.