none
Salvar items checados de um CheckedListBox em uma lista de inteiros RRS feed

  • Pergunta

  • Bom dia

    Sou novo em C# e estou fazendo uma aplicação onde no cadastro de funcionário, existe uma checkedListBox, que puxa do banco de dados as opções de curso que ele poderá ministrar.

    Aqui é o select feito para retornar o código e nome do curso:

     public static IEnumerable<Curso> listBoxCursos()
            {
                Conexao.abrirBanco();
                try
                {
                    List<Curso> resultado = new List<Curso>();
                    string sql = "select codCurso, nome from curso";
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        Curso cur = new Curso()
                        {
                            codigo = reader.GetInt32(0),
                            nome = reader.GetString(1)
                        };
                        resultado.Add(cur);
                    }
                    return resultado;
                }


    Aqui, eu salvo o Value e Display member:

                checkedListBox1.Items.AddRange(Conexao.listBoxCursos().ToArray());
                checkedListBox1.DisplayMember = "nome";
                checkedListBox1.ValueMember = "codigo";

    E esse é o for que eu faço para que fosse adicionando cada código de curso para o atributo curso do funcionário que é um List<int> (para caso o usuário marcar mais que uma opção)

                int teste;
                for (int i = 0; i < checkedListBox1.Items.Count; i++) {
                    if(checkedListBox1.GetItemCheckState(i) == CheckState.Checked) {
                        Int32.TryParse(checkedListBox1.Items[i].ToString(), out teste);
                        func.curso.Add(teste);
                    }
                }

    Porém, é retornado o erro abaixo quando eu marco uma opção e clico em salvar:

    System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto.

    Alguém poderia me dar uma ajuda mostrando onde estou errando ou propondo uma solução?

    Lembrando que eu desejo pegar os ValueMembers dos itens selecionados e jogar no atributo func.codigo (List<int>) para que depois seja salvo no banco de dados.

    Estou usando Visual Studio 2012 e Windows Form

    Fico no aguardo, Obrigado

    quinta-feira, 24 de outubro de 2013 13:11

Respostas

  • Olha este exemplo eu fiz o cast do tipo ListItem pq estou usando o framework 4 e não tem o ValueMember no checklistbox mas pra vc funciona perfeito olha o exemplo ai :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
           
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                List<Curso> lista = new List<Curso>();
                Curso c = new Curso();
                c.nome = "DANIEL";
                c.matricula = 1;
                lista.Add(c);
                
                c.nome = "DANIELteste";
                c.matricula = 22222;
                lista.Add(c);
    
                checkedListBox1.Items.AddRange(lista.ToArray());
                ((ListBox)this.checkedListBox1).DisplayMember = "nome";
                ((ListBox)this.checkedListBox1).ValueMember = "matricula";
            }
    
            class Curso
            {
                public string nome { get; set; }
                public int matricula { get; set; }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                List<int> curso = new List<int>();
    
                foreach (object item in checkedListBox1.CheckedItems)
                {               
                    Curso castedItem = (Curso)item;
                    string comapnyName = castedItem.nome;
                    int id = castedItem.matricula;
                    //isso e um exemplo aqui no id vc poderia adicionar a sua lista de int
                    //como vc disse tipo
                    curso.Add(id);
                }
            }
        }
    }
    
    Se ajudei marque...
    • Sugerido como Resposta Daniel Brito br sexta-feira, 25 de outubro de 2013 12:50
    • Marcado como Resposta G_Costa sexta-feira, 25 de outubro de 2013 15:50
    sexta-feira, 25 de outubro de 2013 09:59
  • Vc instanciou o func ?

    func seria o curso se sim esta faltando.

    o que é func.curso.add ?

    Este erro diz que vc não instanciou tipo : List<Curso> func = new List<Curso>();

    • Marcado como Resposta G_Costa sexta-feira, 25 de outubro de 2013 15:50
    sexta-feira, 25 de outubro de 2013 13:56

Todas as Respostas

  • G_Costa

    tente utilizar algo parecido com:

    foreach (ListItem p in checkedListBox1.Items)
    {
    
       valor = decimal.Parse(p.Value);
    }


    Julio Arruda
    __________________________________________
    Se foi util, marque como resposta
    .Net Coders
    Coordenador .Net Coders

    • Sugerido como Resposta Julio ArrudaMVP quinta-feira, 24 de outubro de 2013 13:15
    quinta-feira, 24 de outubro de 2013 13:15
  • Cara, obrigado pela resposta

    Tentei fazer dessa forma que você me falou, mas não deu certo não...

    Não sei se não entendi direito, mas o ListItem não existe...Ou se eu coloco como var ou List<>, o p.Value não existe também

    Isso seria pra salvar no atributo que é uma List<> os códigos das opções checadas?


    E também os valores seriam inteiros e não decimal, isso também não deu certo

    Um último edit...pelo debug que fiz, o valor "Código" está vindo como null, por isso a exceção

    • Editado G_Costa quinta-feira, 24 de outubro de 2013 17:36
    quinta-feira, 24 de outubro de 2013 17:26
  • Olhe este exemplo ele cria uma classe ListItem e itera pelos valores checados e le o value.

    http://stackoverflow.com/questions/6518518/how-to-get-value-member-of-checked-items-in-checkedlistbox-windows-control

    quinta-feira, 24 de outubro de 2013 17:54
  • Daniel, obrigado pela resposta...

    Tentei fazer um dos exemplos que mostraram lá, adaptando para um List<> com a função de ADD, mas esse ListItem ainda fala que não foi encontrado

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

    Edit: Lendo mais a fundo, ví que ele criou a classe ListItem...

    Mas não estou entendendo nada do que ele fez, sou novato e está dificil de pegar o jeito

    • Editado G_Costa quinta-feira, 24 de outubro de 2013 18:08
    quinta-feira, 24 de outubro de 2013 18:06
  • Então crie esta classe ListItem, e no foreach vc faz igual ele fez no value estará o seu valuemember estendeu, se não conseguir poste o código que te ajudo.
    quinta-feira, 24 de outubro de 2013 18:55
  • Eu criei a classe, mas o que não estou conseguindo fazer é adicionar na lista

    No exemplo, o cara ta jogando na tela(pelo meu entendimento)...

    Eu preciso pegar os valores das opções checadas no CheckedListBox e passar para um List<int>...Ou se houver outra forma, aceito sugestões

    quinta-feira, 24 de outubro de 2013 19:01
  • Olha este exemplo eu fiz o cast do tipo ListItem pq estou usando o framework 4 e não tem o ValueMember no checklistbox mas pra vc funciona perfeito olha o exemplo ai :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
           
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                List<Curso> lista = new List<Curso>();
                Curso c = new Curso();
                c.nome = "DANIEL";
                c.matricula = 1;
                lista.Add(c);
                
                c.nome = "DANIELteste";
                c.matricula = 22222;
                lista.Add(c);
    
                checkedListBox1.Items.AddRange(lista.ToArray());
                ((ListBox)this.checkedListBox1).DisplayMember = "nome";
                ((ListBox)this.checkedListBox1).ValueMember = "matricula";
            }
    
            class Curso
            {
                public string nome { get; set; }
                public int matricula { get; set; }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                List<int> curso = new List<int>();
    
                foreach (object item in checkedListBox1.CheckedItems)
                {               
                    Curso castedItem = (Curso)item;
                    string comapnyName = castedItem.nome;
                    int id = castedItem.matricula;
                    //isso e um exemplo aqui no id vc poderia adicionar a sua lista de int
                    //como vc disse tipo
                    curso.Add(id);
                }
            }
        }
    }
    
    Se ajudei marque...
    • Sugerido como Resposta Daniel Brito br sexta-feira, 25 de outubro de 2013 12:50
    • Marcado como Resposta G_Costa sexta-feira, 25 de outubro de 2013 15:50
    sexta-feira, 25 de outubro de 2013 09:59
  • Bom dia Daniel

    Então cara, teoricamente deu certo...mas ainda não deu

    Explicando melhor...

    Seu comando eu consegui fazer mas o erro ainda continuou o mesmo...só que debugando o sistema, descobri que esse "id" que no final eu faço func.curso.Add(id), ele ta trazendo todos os atributos da classe Curso...mas só queria que trouxesse o ID pro ValueMember...

    Segue a imagem:

    Você saberia me dizer como fazer para que ele puxe somente o ID para jogar no value member e o nome pra jogar no displaymember?

    sexta-feira, 25 de outubro de 2013 12:42
  • Não entendi muito bem, mas quando vc diz que deu um func.curso.add(id) ele adiciona a classe curso com todos os dados de todas as propriedades, pq vc não le estas propriedades e adiciona onde vc quer tenta explicar melhor pra te ajudar.
    sexta-feira, 25 de outubro de 2013 12:49
  • Na verdade, eu debuguei errado...me desculpe...agora que percebi

    Ele está assim:

    O id vale 2...então teoricamente era para ele add normalmente, mas ainda segue o mesmo problema

    No debug tras isso

    sexta-feira, 25 de outubro de 2013 13:41
  • Vc instanciou o func ?

    func seria o curso se sim esta faltando.

    o que é func.curso.add ?

    Este erro diz que vc não instanciou tipo : List<Curso> func = new List<Curso>();

    • Marcado como Resposta G_Costa sexta-feira, 25 de outubro de 2013 15:50
    sexta-feira, 25 de outubro de 2013 13:56
  • Cara, era isso mesmo que faltava

    No almoço agora fui ver com um amigo meu aqui do trabalho e ele passou justamente essa solução no construtor da classe pra iniciar sozinho e deu certo...Valew ae pela ajuda cara, me salvou!

    sexta-feira, 25 de outubro de 2013 15:50
  • Rs me salvou é boa, valeu.

    sexta-feira, 25 de outubro de 2013 16:06