none
Usuário escolher quais colunas do gridview estarão visíveis RRS feed

  • Pergunta

  • Bom dia Pessoal.

    Então, eu criei no meu  RowDataBound um if para que algumas colunas não apareçam caso o usuário não esteja logado, até aí boa.

    if (Session["login"] == null)
                {
                    btnEditar.Visible = false;
                    btnExcluir.Visible = false;
                    gvDados.Columns[3].Visible = false;
                    gvDados.Columns[5].Visible = false;
                    gvDados.Columns[6].Visible = false;
                    gvDados.Columns[8].Visible = false;
                    e.Row.Cells[2].Width = 900;
                    e.Row.Cells[3].Width = 0;
                    e.Row.Cells[4].Width = 400;
                    e.Row.Cells[5].Width = 0;
                    e.Row.Cells[6].Width = 0;
                    e.Row.Cells[8].Width = 0;
                }

    Porém em uma outra tela eu precisaria que isso fosse dinâmico, o usuário adm que escolheria quais colunas devem aparecer para os usuários não logados.

    E é aí que mora meu problema, tentei pesquisar por uma solução mas não encontrei nada parecido.

    Alguém poderia me ajudar?

    Desde já agradeço.

    quarta-feira, 4 de abril de 2012 11:53

Respostas

  • Fiz um exemplo que faz o que você quer. É meramente um exemplo. Muita coisa deve ser melhorada etc.

    Ps: Sempre antes de faze a pesquisa salve as configurações. Quando fazer a pesquisa vai ver que as colunas estão sendo ocultas.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public class Produto
        {
            public int CodigoProduto { get; set; }
            public string Descricao { get; set; }
            public int Quantidade { get; set; }
            public bool Ativo { get; set; }
    
        
            public static List<Produto> GetProdutos()
            {
                List<Produto> produtos = new List<Produto>();
                produtos.Add(new Produto() { CodigoProduto = 1,Descricao = "P1", Quantidade  = 3, Ativo = true });
                produtos.Add(new Produto() { CodigoProduto = 2, Descricao = "P2", Quantidade = 56, Ativo = true });
                produtos.Add(new Produto() { CodigoProduto = 3, Descricao = "P3", Quantidade = 77, Ativo = true });
                return produtos;
            }
        }
        public class DadosCampoConsulta
        {
            public int CodigoCampo { get; set; }
            public string Campo { get; set; }
            public bool Exibir { get; set; }
    
            public static List<DadosCampoConsulta> GetCampos()
            {
                List<DadosCampoConsulta> dadosASeremExibidos = new List<DadosCampoConsulta>();
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 1, Campo = "CodigoProduto", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 2, Campo = "Descricao", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 3, Campo = "Quantidade", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 4, Campo = "Ativo", Exibir = true });
    
                return dadosASeremExibidos;
            }
        }
        public partial class msdn_exemplo_busca : System.Web.UI.Page
        {
            private string camposVisualizados = "_campos";
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    CarregarCampos();
                }
            }
    
            void ValidarPermissoes()
            {
                int index = 0;
    
                if (Session[camposVisualizados] != null && grvDados.Rows.Count > 0)
                {
                    List<DadosCampoConsulta> campos = (List<DadosCampoConsulta>)Session[camposVisualizados];
                    foreach (DadosCampoConsulta campo in campos)
                    {
                        grvDados.Columns[index].Visible = campo.Exibir;
                        index++;
                    }
                }
            }
    
            private void CarregarCampos()
            {
                List<DadosCampoConsulta> dados = DadosCampoConsulta.GetCampos();
                cbxlCampos.DataSource = dados;
                cbxlCampos.DataTextField = "Campo";
                cbxlCampos.DataValueField = "CodigoCampo";
                cbxlCampos.DataBind();
    
                MarcarItens(dados);
            }
    
            void MarcarItens(List<DadosCampoConsulta> dados)
            {
                int x = 0;
                if (dados != null)
                {
                    foreach (ListItem controle in cbxlCampos.Items)
                    {
                        controle.Selected = dados[x].Exibir;
                        x++;
                    }
                    Session[camposVisualizados] = dados;
                }
            }
    
            protected void btnSalvarConfiguracoes_Click(object sender, EventArgs e)
            {
                List<DadosCampoConsulta> camposASeremExibidos = new List<DadosCampoConsulta>();
                foreach (ListItem item in cbxlCampos.Items)
                {
                    DadosCampoConsulta d = new DadosCampoConsulta
                    {
                        CodigoCampo = Int32.Parse(item.Value),
                        Campo = item.Text,
                        Exibir = item.Selected
                    };
                    camposASeremExibidos.Add(d);                
                }
    
                MarcarItens(camposASeremExibidos);
            }
    
            protected void btnBuscar_Click(object sender, EventArgs e)
            {
                grvDados.DataSource = Produto.GetProdutos();
                grvDados.DataBind();
                ValidarPermissoes();
            }
        }
    }

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="msdn_exemplo_busca.aspx.cs" Inherits="WebApplication1.msdn_exemplo_busca" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <fieldset id="fildAreaAdm">
            <legend>Area de Administração</legend>
            <asp:CheckBoxList ID="cbxlCampos" runat="server">
            </asp:CheckBoxList>
                <br />
                <br />
                <asp:Button ID="btnSalvarConfiguracoes" runat="server" 
                    onclick="btnSalvarConfiguracoes_Click" Text="Salvar configurações" />
            </fieldset>
    
            <fieldset id="Fieldset1">
            <legend>Busca</legend>
                <asp:GridView ID="grvDados" runat="server" AutoGenerateColumns="False">
                    <Columns>
                        <asp:BoundField DataField="CodigoProduto" HeaderText="Codigo" />
                        <asp:BoundField DataField="Descricao" HeaderText="Descricao" />
                        <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" />
                        <asp:BoundField DataField="Ativo" HeaderText="Ativo" />
                    </Columns>
                </asp:GridView>
                <br />
                <asp:Button ID="btnBuscar" runat="server" Text="Busca produtos" 
                    onclick="btnBuscar_Click" />
            </fieldset>
        
        </div>
        </form>
    </body>
    </html>
    


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Mayã Gonzalez quarta-feira, 4 de abril de 2012 14:37
    quarta-feira, 4 de abril de 2012 14:14

Todas as Respostas

  • É muito comum você desabilitar/esconder as colunas que possuem algum botão de ação (editar, deletar, alterar). Um modo legal de fazer isto é verificando as permissões do usuário. Fazendo desta forma você nem precisa validar no RowDataBound....

    Essas colunas 3,5,6 e 8. São colunas que apenas exibem informações? Se for e você de fato querer ocultar vai ter que trazer um resultado diferente na consulta, fica melhor... isto que estou lhe indicando é para evitar gambiarras.


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    quarta-feira, 4 de abril de 2012 12:22
  • Mas a minha intenção é que o usuário possa em uma página de configurações escolher quais colunas serão mostradas e quais não.

    Pois terão vários tipos de clientes. E cada um tem seu interesse próprio em mostrar uma coluna ou não ao público em geral. 

    Preciso de uma forma que ele possa escolher o que mostrar. 

    quarta-feira, 4 de abril de 2012 12:31
  • Por exemplo, digamos que é um sistema de comércio.
    Uma loja decide que quer mostrar detalhes do produto e o preço.
    Mas a outra que também vai utilizar o sistema não quer mostrar os detalhes e quer mostrar o fabricante.
    Então o usuário adm de cada loja que irá escolher quais colunas ele quer mostrar ao público e quais ele não quer. 
    quarta-feira, 4 de abril de 2012 12:35
  • Ou seja, a consulta exibida no controle vai ser sempre uma só. Supomos que ela traz 10 informações (Codigo, Descrição, Quantidade etc). O usuário vai poder optar pela visualização de apenas algumas informações no controle? É isto?


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    quarta-feira, 4 de abril de 2012 12:36
  • Exatamente isso.
    quarta-feira, 4 de abril de 2012 12:57
  •  O usuário vai poder optar pela visualização de apenas algumas informações no controle

    O problema é como fazer isso.
    quarta-feira, 4 de abril de 2012 13:28
  • Fiz um exemplo que faz o que você quer. É meramente um exemplo. Muita coisa deve ser melhorada etc.

    Ps: Sempre antes de faze a pesquisa salve as configurações. Quando fazer a pesquisa vai ver que as colunas estão sendo ocultas.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public class Produto
        {
            public int CodigoProduto { get; set; }
            public string Descricao { get; set; }
            public int Quantidade { get; set; }
            public bool Ativo { get; set; }
    
        
            public static List<Produto> GetProdutos()
            {
                List<Produto> produtos = new List<Produto>();
                produtos.Add(new Produto() { CodigoProduto = 1,Descricao = "P1", Quantidade  = 3, Ativo = true });
                produtos.Add(new Produto() { CodigoProduto = 2, Descricao = "P2", Quantidade = 56, Ativo = true });
                produtos.Add(new Produto() { CodigoProduto = 3, Descricao = "P3", Quantidade = 77, Ativo = true });
                return produtos;
            }
        }
        public class DadosCampoConsulta
        {
            public int CodigoCampo { get; set; }
            public string Campo { get; set; }
            public bool Exibir { get; set; }
    
            public static List<DadosCampoConsulta> GetCampos()
            {
                List<DadosCampoConsulta> dadosASeremExibidos = new List<DadosCampoConsulta>();
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 1, Campo = "CodigoProduto", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 2, Campo = "Descricao", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 3, Campo = "Quantidade", Exibir = true });
                dadosASeremExibidos.Add(new DadosCampoConsulta() { CodigoCampo = 4, Campo = "Ativo", Exibir = true });
    
                return dadosASeremExibidos;
            }
        }
        public partial class msdn_exemplo_busca : System.Web.UI.Page
        {
            private string camposVisualizados = "_campos";
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    CarregarCampos();
                }
            }
    
            void ValidarPermissoes()
            {
                int index = 0;
    
                if (Session[camposVisualizados] != null && grvDados.Rows.Count > 0)
                {
                    List<DadosCampoConsulta> campos = (List<DadosCampoConsulta>)Session[camposVisualizados];
                    foreach (DadosCampoConsulta campo in campos)
                    {
                        grvDados.Columns[index].Visible = campo.Exibir;
                        index++;
                    }
                }
            }
    
            private void CarregarCampos()
            {
                List<DadosCampoConsulta> dados = DadosCampoConsulta.GetCampos();
                cbxlCampos.DataSource = dados;
                cbxlCampos.DataTextField = "Campo";
                cbxlCampos.DataValueField = "CodigoCampo";
                cbxlCampos.DataBind();
    
                MarcarItens(dados);
            }
    
            void MarcarItens(List<DadosCampoConsulta> dados)
            {
                int x = 0;
                if (dados != null)
                {
                    foreach (ListItem controle in cbxlCampos.Items)
                    {
                        controle.Selected = dados[x].Exibir;
                        x++;
                    }
                    Session[camposVisualizados] = dados;
                }
            }
    
            protected void btnSalvarConfiguracoes_Click(object sender, EventArgs e)
            {
                List<DadosCampoConsulta> camposASeremExibidos = new List<DadosCampoConsulta>();
                foreach (ListItem item in cbxlCampos.Items)
                {
                    DadosCampoConsulta d = new DadosCampoConsulta
                    {
                        CodigoCampo = Int32.Parse(item.Value),
                        Campo = item.Text,
                        Exibir = item.Selected
                    };
                    camposASeremExibidos.Add(d);                
                }
    
                MarcarItens(camposASeremExibidos);
            }
    
            protected void btnBuscar_Click(object sender, EventArgs e)
            {
                grvDados.DataSource = Produto.GetProdutos();
                grvDados.DataBind();
                ValidarPermissoes();
            }
        }
    }

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="msdn_exemplo_busca.aspx.cs" Inherits="WebApplication1.msdn_exemplo_busca" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <fieldset id="fildAreaAdm">
            <legend>Area de Administração</legend>
            <asp:CheckBoxList ID="cbxlCampos" runat="server">
            </asp:CheckBoxList>
                <br />
                <br />
                <asp:Button ID="btnSalvarConfiguracoes" runat="server" 
                    onclick="btnSalvarConfiguracoes_Click" Text="Salvar configurações" />
            </fieldset>
    
            <fieldset id="Fieldset1">
            <legend>Busca</legend>
                <asp:GridView ID="grvDados" runat="server" AutoGenerateColumns="False">
                    <Columns>
                        <asp:BoundField DataField="CodigoProduto" HeaderText="Codigo" />
                        <asp:BoundField DataField="Descricao" HeaderText="Descricao" />
                        <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" />
                        <asp:BoundField DataField="Ativo" HeaderText="Ativo" />
                    </Columns>
                </asp:GridView>
                <br />
                <asp:Button ID="btnBuscar" runat="server" Text="Busca produtos" 
                    onclick="btnBuscar_Click" />
            </fieldset>
        
        </div>
        </form>
    </body>
    </html>
    


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Mayã Gonzalez quarta-feira, 4 de abril de 2012 14:37
    quarta-feira, 4 de abril de 2012 14:14
  • Opa,  muito  obrigada Paulo!

    Deu certo aqui, valeu!

    quarta-feira, 4 de abril de 2012 14:38