Usuário com melhor resposta
Salvar items checados de um CheckedListBox em uma lista de inteiros

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
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
-
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
Todas as Respostas
-
- Sugerido como Resposta Julio ArrudaMVP 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
-
Olhe este exemplo ele cria uma classe ListItem e itera pelos valores checados e le o value.
-
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
-
-
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
-
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
-
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?
-
-
-
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
-
-