none
exibir imagem (ícone) condicionalmente em DataGridView em Windows Forms C# RRS feed

  • Pergunta

  • Boa noite pessoal,

    sei que existe muito maetrial a respeito da minha dúvida, mas sinceramente, procurei muito mas não encontrei nada que me atendesse. Meu problema é o seguinte: Possuo uma aplicação Windoes forms e tenho um DataGridView sendo populado da seguinte forma:

                AcessoBD instBD = new AcessoBD(); //instancia classe de acesso ao banco de dados
                DataTable dt = instBD.listDocEmUso(); // crio um dataTable para receber o retorno do Banco
                gridEmUso.DataSource = dt.DefaultView; // Populo o DataGridView

    Neste Grid, ou nesta tabela possuo um campo "status" (tipo int), que recebe os valores 0 ou 1. Gostaria da ajuda de vcs para que quando eu ler no campo "status" o valor 0 apresentar no Grid uma imagem1.jpg e se o valor for 1 apresento a imagem2.jpg.

    quinta-feira, 22 de outubro de 2009 02:08

Respostas

  • Pestana você pode fazer assim usando CellFormating, única coisa seu datatable tem que estar visível na sua classe, declare ele como uma variável.

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if(e.ColumnIndex == 0)
                {
                    if (e.RowIndex < this.dataGridView1.Rows.Count-1)
                    {
                        if (Convert.ToInt32(dt.Rows[e.RowIndex]["Status"]) == 1)
                        {
                            e.Value = Image.FromFile("caminho1");
                        }
    else
    {
    e.Value = Image.FromFile("caminho2");
    } } } }
    • Marcado como Resposta PestanaJr quinta-feira, 22 de outubro de 2009 17:20
    quinta-feira, 22 de outubro de 2009 14:47

Todas as Respostas

  • Em modo designer adicione a coluna no seu DataGridView, clique na setinha -> edit columns -> add, escolha do tipo DataGridViewImageColumn. Clique em OK. Sem fechar a outra janela clique em cima dessa coluna que acabou de adicionar e procure por Name do lado direito, de o nome de Imagem.
    Clique em OK, de um clique no DataGridView e nas propriedades gere o evento RowAdded.
    Supondo que sua coluna no DataTabel dt chame Status escrea esse código no RowAdded:

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                DataGridViewImageCell imageCell = this.dataGridView1.Rows[e.RowIndex].Cells["Imagem"] as DataGridViewImageCell;
                imageCell.ValueType = typeof(Image);
                if (Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["Status"].Value) == 1)
                    imageCell.Value = Image.FromFile("camiho imagem 1");
                else
                    imageCell.Value = Image.FromFile("camiho imagem 2");
            }
    • Marcado como Resposta PestanaJr quinta-feira, 22 de outubro de 2009 10:49
    • Não Marcado como Resposta PestanaJr quinta-feira, 22 de outubro de 2009 11:52
    quinta-feira, 22 de outubro de 2009 02:57
  • Murilo,

    apenas um detalhe...

    Não sei pq mas esse evento só está varrendo as duas primeiras linhas do grid. Depois ele sai fora. Vc saberia pq, ou seria possível usar um CellFormatting, por exemplo?

    No aguardo...


    Obrigado


    Pestana
    quinta-feira, 22 de outubro de 2009 11:54
  • Pestana você pode fazer assim usando CellFormating, única coisa seu datatable tem que estar visível na sua classe, declare ele como uma variável.

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if(e.ColumnIndex == 0)
                {
                    if (e.RowIndex < this.dataGridView1.Rows.Count-1)
                    {
                        if (Convert.ToInt32(dt.Rows[e.RowIndex]["Status"]) == 1)
                        {
                            e.Value = Image.FromFile("caminho1");
                        }
    else
    {
    e.Value = Image.FromFile("caminho2");
    } } } }
    • Marcado como Resposta PestanaJr quinta-feira, 22 de outubro de 2009 17:20
    quinta-feira, 22 de outubro de 2009 14:47
  • Agora sim Murilo,

    funcionou como eu queria.....a única observação no código que vc mandou é que era

          if (e.RowIndex <= this.dataGridView1......    ao invés de

          if (e.RowIndex < this.dataGridView1......

    Com apenas < ele não varria a última linha. mas, funcionou diretinho.

    Muito obrigado.

    Forte abraço,

    Pestana
    quinta-feira, 22 de outubro de 2009 17:20