none
erro ao inserir checkbox no datagridview RRS feed

  • Pergunta

  • Saudações.

    Quero colocar uma coluna no meu datagridview. O mesmo é carregado atraves de um datable, estou colocando o seguinte codigo:

                dc = new DataColumn();
                dc.DataType = typeof(bool);
                dc.ColumnName = "Selecionar";
                dt.Columns.Add(dc);

    Mas na hora aparece esse erro:

    Alguma ideia do que possa ser?

    quarta-feira, 17 de junho de 2015 17:42

Respostas

  • Boa tarde.

    Por falta de retorno do usuário, encerro esta thread.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Muito obrigado a todos.

    Excelente tarde

    • Marcado como Resposta Cristopher C I_ terça-feira, 23 de junho de 2015 17:25
    terça-feira, 23 de junho de 2015 17:25

Todas as Respostas

  • Tenta usar o DataGridViewCheckBoxColumn, acho que ele resolve teu problema.
    quarta-feira, 17 de junho de 2015 17:46
  • Usei um codigo que peguei na net

                DataGridViewCheckBoxColumn cb = new DataGridViewCheckBoxColumn();
                cb.HeaderText = "Selecione";
                dgvItemVenda.Columns.AddRange(cb);

    Da o mesmo erro.

    quarta-feira, 17 de junho de 2015 17:53
  • Tem como tu postar o código no qual você criar as outras colunas e uma print do teu DataGrid?
    quarta-feira, 17 de junho de 2015 17:58
  •             DataGridViewCheckBoxColumn cb = new DataGridViewCheckBoxColumn();
                cb.HeaderText = "Selecione";
                dgvItemVenda.Columns.AddRange(cb);

                dc = new DataColumn();
                dc.ColumnName = "ID";
                dc.DataType = typeof(int);
                dc.AutoIncrement = true;
                dc.AutoIncrementSeed = 1;
                dc.AutoIncrementStep = 1;
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "CodProduto";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Descricao";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Qtd";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Medida";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "ValorUnit";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Pontos";
                dt.Columns.Add(dc);

                dgvItemVenda.DataSource = dt;
    quarta-feira, 17 de junho de 2015 18:03
  • O valor que o DataGridView está tentando atribuir para essa sua coluna é um String, sendo assim ele não consegue converter o valor de String para Boolean, o código abaixo estava antes da criação da coluna ID?

     dc = new DataColumn();
                dc.DataType = typeof(bool);
                dc.ColumnName = "Selecionar";
                dt.Columns.Add(dc);

    quarta-feira, 17 de junho de 2015 18:11
  • Estava sim, Bruno.

    Vc pode perceber isso no código que enviei!

    quarta-feira, 17 de junho de 2015 18:17
  • Tenta então colocar ele na última coluna, talvez ele esteja tenta atribuir o valor do ID para essa coluna.
    quarta-feira, 17 de junho de 2015 18:19
  • Deu o mesmo erro. rsrs
    quarta-feira, 17 de junho de 2015 18:31
  • Fiz um banco teste aqui e fiz como tu tinha feito na primeira vez, segue o código.

    DataTable dt = new DataTable();
    
                String insSQL = "select * from Items";
                String strConn = @"Data Source=C:\t.db3";
    
                SQLiteConnection conn = new SQLiteConnection(strConn);
    
                SQLiteDataAdapter da = new SQLiteDataAdapter(insSQL, strConn);
                da.Fill(dt);
    
                DataColumn dc = new DataColumn();
    
                dc = new DataColumn();
                dc.DataType = typeof(bool);
                dc.ColumnName = "Selecionar";
                dt.Columns.Add(dc);
    
                this.dataGridView1.DataSource = dt;

    A maneira na qual você preenche o DataTable é igual ao código acima?

    quarta-feira, 17 de junho de 2015 18:47
  • Sim, Bruno. Única diferença é que uso postgresql

                        string CodProduto = "CodProduto";
                        string Descricao = "Descricao";
                        string Medida = "Medida";
                        string ValorUnit = "ValorUnit";
                        string Pontos = "Pontos";
                        string qtd = "Qtd";
                        Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
                        con.ConnectionString = @"";
                        con.Open();
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT produtoid, codigoproduto as " + CodProduto + ", descricao as " + Descricao + ", qtd as " + qtd + ", medida as " + Medida + ", valorUnit as " + ValorUnit + "," +
                            "pontosProduto as " + Pontos + " FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
                        Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
                        Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
                        // Preencher um DataTable Temporário
                        dtTemp = new DataTable();
                        da.Fill(dt);

                        // Verificar se o DataTable possui algum registro
                        if (dt != null && dt.Rows.Count > 0)
                        {
                            if (dt.Select("" + CodProduto + "= " + txtCodProduto.Text).Length == 0)
                            {
                                dt.Rows.Add(dtTemp.Rows[0]);
                            }
                        }

                        this.dgvItemVenda.DataSource = dt;

    quarta-feira, 17 de junho de 2015 19:07
  • Este teu DataGrid está com a propriedade AutoGenerateColumns true or false?
    quarta-feira, 17 de junho de 2015 19:15
  • Outra coisa que você pode fazer, tenta trocar o tipo dessa coluna "selecionar" para string para ver quais valores que serão atribuídos.
    quarta-feira, 17 de junho de 2015 19:23
  • Você falou e eu fui verificar a propriedade AutoGenerateColumns, ela estava como true e troquei pra false e fiz o teste, da o mesmo erro.

    colocando pra string ele só mostra a coluna "Selecionar" mesmo, não aparece o checkbox.

    Tá complicado desse jeito, tenho outro em mente mas esse seria mais fácil de entender pro usuário final.

    quarta-feira, 17 de junho de 2015 19:55
  • Por que você não deixar ele gerar as colunas automaticamente com o AutoGenerateColumns?

    Se você puder me mandar o teu código todo para que eu possar dar uma olhada aqui, o teu código tá certinho, deveria funcionar sem problemas.

    quarta-feira, 17 de junho de 2015 20:12
  • private DataTable dt = null;
    decimal soma;

    public void criarDataTable()
            {
                dt = new DataTable();

                DataColumn dc;

                DataGridViewCheckBoxColumn cb = new DataGridViewCheckBoxColumn();
                cb.HeaderText = "Selecione";
                dgvItemVenda.Columns.Add(cb);
                dgvItemVenda.Columns[0].Visible = false;

                dc = new DataColumn();
                dc.ColumnName = "ID";
                dc.DataType = typeof(int);
                dc.AutoIncrement = true;
                dc.AutoIncrementSeed = 1;
                dc.AutoIncrementStep = 1;
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "CodProduto";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Descricao";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Qtd";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Medida";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "ValorUnit";
                dt.Columns.Add(dc);

                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "Pontos";
                dt.Columns.Add(dc);

                dgvItemVenda.DataSource = dt;
            }

    private void txtCodProduto_KeyDown(object sender, KeyEventArgs e)
            {
                DataTable dtTemp = null;

                if (e.KeyCode == Keys.Enter)
                {
                    try
                    {
                        if (dt == null)
                        {
                            criarDataTable();
                        }

                        string CodProduto = "CodProduto";
                        string Descricao = "Descricao";
                        string Medida = "Medida";
                        string ValorUnit = "ValorUnit";
                        string Pontos = "Pontos";
                        string qtd = "Qtd";
                        Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
                        con.ConnectionString = @"";
                        con.Open();
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT produtoid, codigoproduto as " + CodProduto + ", descricao as " + Descricao + ", qtd as " + qtd + ", medida as " + Medida + ", valorUnit as " + ValorUnit + "," +
                            "pontosProduto as " + Pontos + " FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
                        Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
                        Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
                        // Preencher um DataTable Temporário
                        dtTemp = new DataTable();
                        da.Fill(dt);

                        // Verificar se o DataTable possui algum registro
                        if (dt != null && dt.Rows.Count > 0)
                        {
                            if (dt.Select("" + CodProduto + "= " + txtCodProduto.Text).Length == 0)
                            {
                                dt.Rows.Add(dtTemp.Rows[0]);
                            }
                        }

                        this.dgvItemVenda.DataSource = dt;
                        this.dgvItemVenda.Columns[7].Visible = false;

                        calcularLinhas();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

    private void calcularLinhas()
            {
                soma = 0;
                foreach (DataGridViewRow dr in this.dgvItemVenda.Rows)
                {
                    soma += Convert.ToDecimal(dr.Cells[6].Value);
                    txtTotal.Text = Convert.ToString(soma);
                }
            }

    Qualquer dúvida pode perguntar, Bruno!

    quarta-feira, 17 de junho de 2015 20:50
  • Beleza Gustavo, Obrigado.

    Assim que eu puder eu vou rodar esse teu código e ver se consigo fazer acontecer esse problema.

    Abraço!

    quarta-feira, 17 de junho de 2015 22:54
  • Olá Gustavo, tentei reproduzir o seu erro aqui mas sem sucesso, faz o seguinte, tente usar esse código abaixo, eu tirei algumas coisas só para teste mesmo.

    private void txtCodProduto_KeyDown(object sender, KeyEventArgs e)
            {
                DataTable dtTemp = null;
    
                if (e.KeyCode == Keys.Enter)
                {
                    try
                    {
                        string CodProduto = "CodProduto";
                        string Descricao = "Descricao";
                        string Medida = "Medida";
                        string ValorUnit = "ValorUnit";
                        string Pontos = "Pontos";
                        string qtd = "Qtd";
                        Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
                        con.ConnectionString = @"";
                        con.Open();
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT produtoid, codigoproduto as " + CodProduto + ", descricao as " + Descricao + ", qtd as " + qtd + ", medida as " + Medida + ", valorUnit as " + ValorUnit + "," +
                            "pontosProduto as " + Pontos + " FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
                        Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
                        Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
                        
                        da.Fill(dt);
    
                        DataColumn dc = new DataColumn();
                        dc.DataType = typeof(bool);
                        dc.ColumnName = "Selecionar";
                        dt.Columns.Add(dc);
    
                        this.dgvItemVenda.DataSource = dt;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

    Esse código não faz a mesma coisa que o antigo, eu tirei aquela parte que ele adicionar as Rows e cria as colunas só para teste, certifique-se que o AutoGenerateColumns está true.


    Se não funcionar essa solução, gostaria que, se possível, que tu fizesse o Upload de todo teu projeto e teu banco de dados e me enviasse o link para que eu possa tentar reproduzir o erro aqui.
    quinta-feira, 18 de junho de 2015 11:22
  • Bruno, eu já havia tentado essa tentativa acima mas sem sucesso.

    Infelizmente não posso te enviar o projeto por questões profissionais, espero que entenda!

    Vou buscar mais alguma coisa na internet.

    quinta-feira, 18 de junho de 2015 13:51
  • Sem problemas Gustavo, desculpa por não conseguir ajudar.

    Caso ache a solução, favor postar para que fique registrado para ajudar usuários com o mesmo problema.

    quinta-feira, 18 de junho de 2015 14:28
  • Tudo bem, posto sim.

    Obrigado!

    quinta-feira, 18 de junho de 2015 15:00
  • Eu descobri que mesmo add uma coluna do tipo checkbox pelas propriedades do datagridview ele da o erro.

    Que louco, não?

    quinta-feira, 18 de junho de 2015 15:28
  • O erro acontece pois ele está tentando converter "" para boolean, o grande problema é descobrir por que o DataGridView está atribuindo o valor "" para esta coluna.
    quinta-feira, 18 de junho de 2015 16:16
  • Boa tarde Gustavo.

    Conseguiu solucionar o erro?

    Excelente segunda-feira.

    Abraços

    segunda-feira, 22 de junho de 2015 19:18
  • Boa tarde.

    Por falta de retorno do usuário, encerro esta thread.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Muito obrigado a todos.

    Excelente tarde

    • Marcado como Resposta Cristopher C I_ terça-feira, 23 de junho de 2015 17:25
    terça-feira, 23 de junho de 2015 17:25