Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KhaosDoctor

[Resolvido] Problema no C#.NET com ValueMember

Recommended Posts

Olá pessoal,

 

Estou enfrentando um problema na hora de armazenar valores em uma listbox.

 

O que eu preciso fazer é armazenar um código proveniente de uma tabela chamada "histt", que é a tabela de histórico do programa, que deve levar a outra tabela de resultados. Porem eu quero que todos os valores desta tabela apareçam em uma listbox, até ai já consegui resolver, porem o problema é que não consigo armazenar os índices que eu preciso no ValueMember, porque eu preciso que para cada item o ValueMember dele seja igual a seu campo respectivo no banco de dados.

 

Uma síntese, eu preciso armazenar um campo específico do banco de dados em uma listbox, porque eu não quero mostrar quanto este campo vale, quero que ele seja oculto e quando eu clicar ele irá buscar este valor para exibir o resultado que já está funcionando.

 

O Problema é que para todos os itens ele só armazena um valor, se eu coloco para armazenar os itens do contador "i" ele só armazena o índice do primeiro registro do banco de dados, então todos os SelectedIndex aparecem com o mesmo índice 1.

 

Quero arrumar um jeito de atribuir a cada item da listbox o seu valor específico, ou seja, se o item 1 tem no banco de dados o índice 10, ele vai armazenar o índice 10.

 

Eis o meu código:

 

 private void frmprincipal_Load(object sender, EventArgs e)
       {

           if (recuperah().Rows.Count > 0)
           {
                Console.WriteLine("Entrou");
               for(int i=0;i<recuperah().Rows.Count;i++){
                   lsthistorico.ValueMember = recuperah().Rows[i]["Indice"].ToString();
                   lsthistorico.Items.Add(recuperah().Rows[i]["Título"].ToString() + "      " + recuperah().Rows[i]["Data"].ToString());
               }
           }
}

 

 

Este seguinte é o código do void do DataTable que eu uso para buscar os valores, o método "Recuperah":

 

 

private DataTable recuperah()
       {
           try
           {
               SqlCeConnection newco = new SqlCeConnection(Class1.conexao);
               String sql = "SELECT * FROM histt";
               SqlCeDataAdapter da = new SqlCeDataAdapter(sql, newco);
               DataTable dt = new DataTable();
               da.Fill(dt);
               return dt;
           }
           catch (Exception a)
           {
               MessageBox.Show("Erro de leitura \n" + a.ToString());
               return null;
           }
       }

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça uma forma diferente:

 

lsthistorico.Items.Add(new ListItem(string.Format("{0}      {1}", recuperah().Rows[i]["Título"].ToString(), recuperah().Rows[i]["Data"].ToString()), recuperah().Rows[i]["Indice"].ToString()));

 

Repare que no seu código quando você utiliza o método Add não usou seu campoIndice o que fez na linha acima não serviu para nada.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui não funcionou, a palavra ListItem não é reconhecida, eu tenho uma listbox, e não uma ListView.

 

Adicionar a linha eu consigo, o problema é dar a essa linha o valor que ela tem no banco de dados, porque o value member não está armazenando o campo indice que eu preciso, tenho o mesmo problema em outra textbox, neste caso com uma pesquisa, ele deverá fazer uma pesquisa e mostrar os campos encontrados, até ai tudo bem, após isso eu preciso que ele execute a mesma coisa: Ao clicar buscar o valor do indice no banco de dados e abrir o formulário de resultado, porem não funciona.

 

Função de busca:

 

private DataTable pesquisardesc()
       {
           try
           {
               SqlCeConnection newco = new SqlCeConnection(Class1.conexao);
               String sql = "SELECT * FROM lei WHERE descricao LIKE '%" + textBox1.Text + "%' or titulo LIKE '%" + textBox1.Text + "%'";
               SqlCeDataAdapter da = new SqlCeDataAdapter(sql, newco);
               DataTable dt = new DataTable();
               da.Fill(dt);
               return dt;
           }
           catch (Exception a)
           {
               MessageBox.Show("Erro de leitura \n" + a.ToString());
               return null;
           }
       }

 

 

Função quando apertar enter na textbox para iniciar busca:

 

if (textBox1.Text.Equals("Pesquisar"))
           {
               textBox1.Clear();
           }
           else
           {
               textBox1.Text = textBox1.Text;
           }
           if (e.KeyChar == (char)13)
           {
               pesquisardesc();

               lstpesquisa.DataSource = null;

               lstpesquisa.DataSource = pesquisardesc();
               lstpesquisa.DisplayMember = "titulo";


               lstpesquisa.ValueMember = "indicelei";
           }

 

 

Quando o item é clicado duas vezes para abrir, aqui está o problema, eu não consigo definir o value member para ele que bata com o campo indicelei no BD:

 

 try
           {
               progressbar();
               if (lstpesquisa.SelectedItem == null || lstpesquisa.SelectedItem.ToString() == "")
               {
                   MessageBox.Show("Selecione um item", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
               }
               else if (lstpesquisa.SelectedItem != null)
               {
                   if (lstpesquisa.SelectedItem.ToString().Length != 0)
                   {
                       int indice = Convert.ToInt32(lstpesquisa.ValueMember);
                       Class1.indicelei = indice;


                       lstpesquisa.SelectedIndex = -1;
                       frmresult j5 = new frmresult();
                       j5.Show();
                       Class1.j = 1;
                       toolStripStatusLabel2.Text = "Abrindo resultado...";
                       timer2.Enabled = true;


                   }
               }
           }
           catch (Exception j)
           {
               MessageBox.Show("Não foi possível concluir a ação: Resultado" + Environment.NewLine + j.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é windows app.

 

Eu consegui resolver o problema de outro jeito.

 

Ao invés de utilizar a listbox com o value member eu criei um private datatable para buscar o item que selecionei e pegar o código jogando-o em um variavel dentro de uma classe, não foi nem necessário o value member.

 

Sei que pode não ser o mais simples ou mais rápido mas funcionou muito bem e bastante rapido tambem ^^

 

Pode fechar o tópico e obrigado pela ajuda ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.