Array
(
)

imagebutton dentro de um grid view

Paulo Magalhães
   - 16 fev 2012

Boa tarde

Tenho um gridview que é carregado com dados de uma tabela no meu BD. No final de cada registro da grid é inserido uma imagebutton para permitir que o usuário possa alterar o registro.
Porém existe um determinado tipo de usuário que só tem permissão para consultar essas informações.
Para esses perfil de usuário quero que a image não apareça (visible=false).
Sei que usando o código (grvPrincipal.Columns[8].Visible = false;) eu resolvo essa situação.
Mas caso eu queira incluir ou retirar uma coluna do meu grid, vou precisar alterar o índice referente a coluna do imagebutton.
O que queria saber é se existe alguma forma de referenciar essa coluna, que não fosse usando índice. Por exemplo um id? Para evitar problemas com manuntenção de perfis.

Código do template dentro da gridview:
<asp:TemplateField>
<ItemStyle Width=15px HorizontalAlign=Center VerticalAlign=Top />
<ItemTemplate>
<asp:ImageButton ID=btnAlterar runat=server CommandName=btnAlterar ImageUrl=~/img/bot_pencil.png
CausesValidation=False EnableViewState=false ToolTip=Alterar></asp:ImageButton>
</ItemTemplate>
</asp:TemplateField>

Grato pela atenção
Paulo

Joel Rodrigues
   - 16 fev 2012

Bem, eu testei a seguinte solução e acredito que lhe sirva:

-----------
MyGridView.Columns.OfType<TemplateField>().Where(c => c.HeaderText==ALTERAR).First().Visible = false;
-----------

Considerando que o HeaderText da sua coluna é ALTERAR. Você pode definir outra propriedade e filtrar por ela, mas acho eu essa é a mais simples de manipular, pois a maioria das propriedades da coluna são de formatação de estilo. Então, você pode definir o HeaderText e deixar o Header invisível.

Acho que lhe serve, teste aí e diga o resultado.

Boa sorte.

Paulo Magalhães
   - 17 fev 2012

Bom dia Joel,

Valeu pela resposta, mas não entendi a solução.

Where(c => c.HeaderText==ALTERAR) ????

O que é o C?

Ahhhh.....Estou usando C#.

Grato, Paulo.

Citação:
Bem, eu testei a seguinte solução e acredito que lhe sirva:

-----------
MyGridView.Columns.OfType<TemplateField>().Where(c => c.HeaderText==ALTERAR).First().Visible = false;
-----------

Considerando que o HeaderText da sua coluna é ALTERAR. Você pode definir outra propriedade e filtrar por ela, mas acho eu essa é a mais simples de manipular, pois a maioria das propriedades da coluna são de formatação de estilo. Então, você pode definir o HeaderText e deixar o Header invisível.

Acho que lhe serve, teste aí e diga o resultado.

Boa sorte.


Joel Rodrigues
   - 17 fev 2012

Nesse caso, utilizei um recurso do LINQ chamado Lambda Expressions, isso explica a sintaxe que utilizei no exemplo

Detalhando:

MyGridView. ---> meu objeto GridView
Columns. ---> a coleção de colunas do gridview, ou seja, uma coleção de DataControlField
OfType<TemplateField>(). ---> retorna uma lista (lista na qual pode-se aplicar uma consulta linq) somente com as cujo tipo seja TemplateField
Where(c => c.HeaderText==ALTERAR). ---> aqui, C passa a ser um objeto genérico que representa cada coluna da lista e eu filtro somente as colunas cujo HeaderTExt seja ALTERAR
First(). ---> me retorna o primeiro item da lista, por exemplo, poderia haver mais de uma coluna com essas características. Aqui eu poderia usar o método Take(1);
Visible = false; ---> a propriedade Visible do objeto retornado pela consulta passa a ser false;

Dê uma olhada no linke:
http://msdn.microsoft.com/pt-br/library/bb397687.aspx

Bem, falei realmente o básico somente para explicar a expressão, caso tenha dúvidas, fique à vontade para questionar.

Boa sorte.

Joel Rodrigues
   - 17 fev 2012

Leia-se:

OfType<TemplateField>(). ---> retorna uma lista (lista na qual pode-se aplicar uma consulta linq) somente com as *COLUNAS* cujo tipo seja TemplateField

e *LINK*.

Paulo Magalhães
   - 23 fev 2012

Olá Joel.....

Encontrei outra solução.

No templatefield coloquei um método que retorna true ou false na propriedade visible:

<asp:TemplateField>
<ItemStyle Width=15px HorizontalAlign=Center VerticalAlign=Top />
<ItemTemplate>
<asp:ImageButton ID=btnAlterar runat=server CommandName=btnAlterar ImageUrl=~/img/bot_pencil.png
CausesValidation=False EnableViewState=false ToolTip=Alterar Visible=<%# VerificaPerfil() %>></asp:ImageButton>
</ItemTemplate>

E nesse método eu verifico o perfil di usuario logado.

Vlw pela atenção.
Paulo.

Joel Rodrigues
   - 23 fev 2012

Beleza, eu tinha pensado nisso também, foi falha minha não ter sugerido antes.
Mas que bom que você chegou a uma solução.
Boa sorte.