none
LINQ e C#, renomeando colunas de um datagridview RRS feed

  • Pergunta

  • Olá, para renomear as colunas do meu datagrid eu faço assim:

    gClientes.DataSource = from Q in CP.clientes where Q.id_cliente == Codigo select new {Nome = Q.nome, Nascimento = Q.data_nascimento, Q.RG };

    Mas e se eu quiser colocar espaço... em vez de Nome, ser Nome do Cliente

    Tentei de todas as formas e dfeu erro aqui.

    Um amigo meu me disse q no VB dá pra fazer da seguinte forma:

    gClientes.DataSource = (from Q in CP.clientes where Q.id_cliente = Codigo select new {'Nome do Cliente' = Q.nome })

    Só sei q no C# isso não dá certo.  Alguem dá uma dica?
    Se a resposta foi útil, por favor marque como útil. ____________________________________ Leiam a bíblia.
    sexta-feira, 22 de janeiro de 2010 02:52

Respostas

Todas as Respostas

  • Eu também sofro um pouco com o Alias, pra espaçamento e acentuação (afinal na tela do cliente é meio complicado deixar campos nomeados como Descricao.

    Eu gostaria também de saber se existe uma maneira melhor!
    sexta-feira, 22 de janeiro de 2010 10:21
  • Galera,

    Pode ser feito o seguinte:

    No datagrid tem do lado de cima tem uma setinha... clica nela e vai em Add Column você pode definir o HeaderText la e também um nome para a coluna.
    Ai clica na setinha de novo e vai em Edit Column, tem a propriedade DataPropertyName nela você coloca a propriedade do seu tipo anonimo.

    Na verdade quando faz o select new está criando um tipo anonimo, agora não sei como fazer para essa propriedade do tipo anonimo ficar 'nome do cliente'.

    Henrique Tambalo
    sexta-feira, 22 de janeiro de 2010 11:52
  • É que nesse exemplo o grid ficaria estático Henrique.

    A vantagem de utilizar LINQ é que pode-se usar dinamicamente!
    sexta-feira, 22 de janeiro de 2010 12:44
  • Pois é... o intrigante é q parece q no VB dá certo   'Nome do Ciente' = Q.nome.... mas o mesmo não dá em C#...
    Se a resposta foi útil, por favor marque como útil. ____________________________________ Leiam a bíblia.
    sexta-feira, 22 de janeiro de 2010 12:53
  • Pelo que andei lendo é proibido utilizar espaço.

    Eu estou tentando fazer o seguinte:

    Usar os Alias separados por underline _

    e no grid, depois de setar o datasource, dar um replace nos Headers, de "_" pra " "
    mas não estou conseguindo acesso ao header, alguem sabe como eu faria isso?
    tentei via foreach mas não sei quais as configurações pra se percorrer o header do grid, alguem sabe?
    sexta-feira, 22 de janeiro de 2010 13:13
  • Mas iss so resolve  problema do espaço... e de frma pouco elegante.

    E se uma coluna se chamar, por exemplo, "Função"... nem dá pra colocar o ç nem o acento til.

    Quando chegar em casa vou investigar essa história d VB aceitar renomear as colunas....

    Se a resposta foi útil, por favor marque como útil. ____________________________________ Leiam a bíblia.
    sexta-feira, 22 de janeiro de 2010 13:32
  • Aqui funcionou com acento sim Cristiano, acabei de terminar o teste, ficou perfeito.

    Da uma olhada no código:

    private void frmTeste_Load(object sender, EventArgs e)
            {
                Entities db = new Entities();
                this.grdTeste.DataSource = from p in db.Produto select new { cod_produto = p.codigo, Descrição_Produto = p.descricao };

                int qtdColunas = 0;
                for (qtdColunas = 0; qtdColunas < this.grdTeste.ColumnCount; qtdColunas++)
                {
                    MessageBox.Show(this.grdTeste.Columns[qtdColunas].HeaderText);
                    this.grdTeste.Columns[qtdColunas].HeaderText = this.grdTeste.Columns[qtdColunas].HeaderText.Replace("_", " ");
                }
            }
    sexta-feira, 22 de janeiro de 2010 13:40
  • Daniel,

    Para alterar o _ para " " segue o código

                foreach (DataGridViewColumn col in this.dataGridView1.Columns)
                {
                    col.HeaderText = col.HeaderText.Replace("_", " ");
                }

    Henrique Tambalo
    sexta-feira, 22 de janeiro de 2010 13:44
  • Opa obrigado Henrique, agora ficou mais interessante. Exemplo testado e funcionando.

    Vou postar o meu método alterado:

    private void frmTeste_Load(object sender, EventArgs e)
            {
                Entities db = new Entities();
                this.grdTeste.DataSource = from p in db.Produto select new { cod_produto = p.codigo, Descrição_Produto = p.descricao };

                foreach (DataGridViewColumn col in this.this.grdTeste.Columns)
                {
                    col.HeaderText = col.HeaderText.Replace("_", " ");
                }
            }
    sexta-feira, 22 de janeiro de 2010 13:59
  • Cara na verdade quando estamos fazendo um select new, estamos criando um tipo anonimo e cod_produto no caso seria uma Propriedade do tipo anonimo, agora eu nunca vi e não sei se dá para ter uma propriedade ou uma variavel com espaços...

    Henrique Tambalo
    sexta-feira, 22 de janeiro de 2010 14:02
  • Exato... Não é bem um alias e sim uma propriedade.

    Com esse "disfarce" que eu fiz, funcionou, mas não que seja o ideal, hehehe
    sexta-feira, 22 de janeiro de 2010 14:19
  • Relamente funcionou o acento e o cedilha....

    Agora só falta mesmo resolver o problema do espaço...

    Tudo bem q existe o recurso de renomear os headers depois, mas sei lá, eu acho deselegante isso... não gosto de programação q vc faz e depois sair remendando... gosto de programação q vc configura as coisas na hora da implementação.

    Mas isso é só uma frescura minha.

    Se a resposta foi útil, por favor marque como útil. ____________________________________ Leiam a bíblia.
    sexta-feira, 22 de janeiro de 2010 15:18
  • Pelo que pesquisei é impossível de funcionar isso em c#.

    Assim como é impossível de funcionar o seguinte código:

    int a = "x";


    coisa que em VB funciona! Vai entender VB...hehehe

    Eu tambem não gosto disso não de ficar refazendo em cima todas as vezes, mas e se a gente fizesse um grid por nós mesmos, e no evento datasourceChanged setasse pra renomear os headers?

    A gente faria um componente uma única vez, e usaria no projeto inteiro. O que acha da idéia, vamos tentar?
    sexta-feira, 22 de janeiro de 2010 15:51
  • Já consegui fazer o evento do grid:

    private void grdTeste_DataSourceChanged(object sender, EventArgs e)
            {
                if (!(grdTeste.DataSource == null))
                {
                    foreach (DataGridViewColumn col in this.grdTeste.Columns)
                    {
                        col.HeaderText = col.HeaderText.Replace("_", " ");
                    }
                }
            }


    Agora vou fazer o meu PatternDataGridView e adicionar esse comando a ele
    sexta-feira, 22 de janeiro de 2010 15:59
  • Acabo de terminar o meu próprio componente DataGridView que faz o ajusta no Header. Só criar essa classe abaixo, compilar o projeto, visualizar o PatternDataGridView na toolbox, e arrastálo ao form, nunca mais vai revirar código!






    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Materiais.Classes
    {
        class PatternDataGridView : DataGridView
        {
            protected override void OnDataSourceChanged(EventArgs e)
            {
                base.OnDataSourceChanged(e);
                if (!(this.DataSource == null))
                {
                    foreach (DataGridViewColumn col in this.Columns)
                    {
                        col.HeaderText = col.HeaderText.Replace("_", " ");
                    }
                }
            }
        }
    }

    sexta-feira, 22 de janeiro de 2010 16:05
  • Tem uma outra alternativa, mas tem que criar uma classe... Olha o exemplo abaixo:

            private void Form1_Load(object sender, EventArgs e)
            {
                using (RestauranteDataContext dtx = new RestauranteDataContext())
                {
                    this.dataGridView1.DataSource = from u in dtx.tbUsuarios
                                                    select new Teste { 
                                                        Nome_do_Usuario = u.usu_Login, 
                                                        Senha_do_Usuario = u.usu_Senha };
                }
    
            }
    
    
        }
    
        public class Teste
        {
            [DisplayName("Nome do Usuario")]
            public string Nome_do_Usuario { get; set; }
            [DisplayName("Senha do Usuario")]
            public string Senha_do_Usuario { get; set; }
        }


    Henrique Tambalo
    sexta-feira, 22 de janeiro de 2010 16:39
  • Legal esse componente, vou usr aqui.

    Aproveitando o tópico e já q enveredamos pelo caminho dos usercntrols... quando se cria um usercontrol e o referencia no projeto, bem como na barra de ferramentas, o ícone q aparece é o padrão, ou seja, o de uma engrenagem azul... e é assim pra todos os usercontrols.

    A pergunta é: Como colocar um ícone em nossos componentes pra q seja exibido lá na toolbar?

    Se a resposta foi útil, por favor marque como útil. ____________________________________ Leiam a bíblia.
    sexta-feira, 22 de janeiro de 2010 17:13
  • Cara, o meu visual studio 2008 já seta esse combonente na toolbox automaticamente, somente debugando o projeto.
    Não sei em versões anteriores
    sexta-feira, 22 de janeiro de 2010 17:47
  • Cristiano,

    A pergunta é: Como colocar um ícone em nossos componentes pra q seja exibido lá na toolbar?

    How to: Provide a Toolbox Bitmap for a Control
    http://msdn.microsoft.com/en-us/library/4wk1wc0a.aspx

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    • Marcado como Resposta Tianodraco domingo, 24 de janeiro de 2010 02:28
    domingo, 24 de janeiro de 2010 01:54
    Moderador