DATAGRIDVIEW - ALTERAR IMAGEM DA COLUNA

PERCIFILHO 19/01/2017 16:03:57
#470856
Boa tarde, meus amigos!
Estou preenchendo um DatagridView com DataSource, por exemplo:

var dados = from c in db.Cliente
select new { c.Cliente_Id, c.Cliente_Nome, c.Cliente_Cnpj } ;

dgvClientes.DataSource = dados.ToList();


Depois eu crio duas ImageColumns no DataGridView (editar e excluir):

DataGridViewImageColumn img = new DataGridViewImageColumn();
Image imagem = Image.FromFile(caminhoImagem);
img.Image = imagem;
grid.Columns.Add(img);
img.HeaderText = tituloColuna;


Pois bem, eu consigo inserir essas imagens nas colunas perfeitamente.
Agora eu gostaria se fosse possível, alterar as imagens, da seguinte maneira:
Vou verificar se o cliente está ativo. Se estiver, eu insiro essas imagens que eu citei, e se não estiver, quero inserir uma outra imagem no lugar dessas.
Ou seja, tenho uma imagem vazia, então se o cliente estiver ativo, mostro a imagem de editar e excluir e se não estiver ativo, mostro as imagens vazias nas colunas.
Não sei se fui claro. Estou tentando, mas até agora ainda não consegui resolver.
Até mais;


DAMASCENO.CESAR 19/01/2017 16:50:47
#470861
Não uso C# e não testei seu código, mas você insere todas as imagens de uma só vez pelo que parece.
acho que deveria correr o grid verificando se o cliente está ativo: se sim, mantem a imagem (ou insere); se não, deixa as células vazia.
de preferencia que já exista no grid a informação de cliente ativo ou inativo, para não ter que realizar consulta no bd a todo momento


GUIMORAES 19/01/2017 17:05:50
#470863
PERCIFILHO

Pelo que vi, você está retornando uma List<T> de uma classe. Já pensou em passar as imagens em um atributo da classe para exibi-las na grid, isto pouparia o trabalho de ter que fazer um loop nos registros já adicionados na grid.

A outra opção, que não recomendo nesta situação, é percorrer a grid e testar uma condição em determinada coluna.

ex: [Ô]Não testei, é apenas um pseudo código[Ô].
  

Bitmap img = new Bitmap(@[Ô]C:\Imagem.jpg[Ô]);

for(int i = 0; i<= suaGrid.Rows.Count - 1; i++)
{
if (suagrid.Rows[i].Cells[[Ô]ativo[Ô]].Value == [Ô]Ativo[Ô])
{
suaGrid.Rows[i].Cells[[Ô]imagem].Value = img;
}
}
PERCIFILHO 20/01/2017 07:26:03
#470874
Damasceno.Cesar e GuiMoraes123 -> é justamente isso que eu não queria fazer: preencher a grid e depois percorrer todas as linhas e modificar uma coluna. Isso fica inviável, pois se a grid contiver muitas linhas, fica meio demorado e creio que não é uma boa prática. Já fiz isso quando ainda não havia adotado algumas práticas mais interessantes e posso afirmar que não é legal além de deixar o retorno dos dados no grid, mais lento.
Eu pesquisei bastante e consegui fazer usando o evento CellFormatting do DataGridView, aí é só fazer a verificação e escolher a imagem que quiser colocar:

if (dgv.Columns[e.ColumnIndex].Name == [Ô]Editar[Ô])
{
if (dgv.Rows[e.RowIndex].Cells[[Ô]Ativo[Ô]].Value.Equals(false))
{
e.Value = Image.FromFile(Application.StartupPath + [Ô]\\imagens\\editar_disabled.png[Ô]);
}
else
{
e.Value = Image.FromFile(Application.StartupPath + [Ô]\\imagens\\editar.png);
}
}
Tópico encerrado , respostas não são mais permitidas