Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 537379
            [titulo] => Formatar data em um grid view
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-11-17 12:34:36
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 418027
            [status] => A
            [isExample] => 
            [NomeUsuario] => Jothaz
            [Apelido] => 
            [Foto] => 418027_20150313165406.jpg
            [Conteudo] => Esse código funciona?

Normalmente uso assim:


[code]
<Columns>
<asp:BoundField DataField="Nome" HeaderText="Customer Name" />

<asp:BoundField HeaderText="Data" DataField="Data de Admissão" DataFormatString="{0:dd/MM/yy}">

...
...
..


[/code]

Outra forma e formatar no próprio SQL, não acho a melhor, pois formatando no grid você pode mudar de bd que vai funcionar, se formatar direto no SQL não.

[code]
.. .... CONVERT(VARCHAR(10),a.DT_Adm ,103) as 'Data de Admissão'.....
[/code] ) )

Formatar data em um grid view

Ricardo
   - 17 nov 2015

Bom dia, estou desenvolvendo uma aplicação utilizando Asp .Net e C#, mas não tenho muitos conhecimentos, logo, alem dessa duvida tenho muitas outras.
Como eu faço para formatar a data no grid view? Na minha tabela do SQL a coluna data está defina como DATE, e quando eu exibo os dados no meu grid view ele mostra "DD/MM/AAAA 00:00:00", ou seja, ele traz a data e a hora, mas eu não tenho essa informação no banco de dados. Com isso não consigo voltar o valor da data para o meu text box, pq eu defini o text bom como date.
Tenho dois campos que guardam a hora, e esses estão funcionando corretamente, tanto no banco quanto na aplicação.
Estou preenchendo o grid view com um DataTable, coloquei o código no load da página para a lista de funcionários ser carregada no inicio.
Chamando o metodo no load da página
#Código

protected void Page_Load(object sender, EventArgs e)
        {
            //carrega grid com dados da tabela Funcionarios do Banco de dados
            DataTable ListFunc = Funcionarios.ListaFuncionarios();
            GridPrincipal.DataSource = ListFunc;
            DataBind();
        }


Metodo na classe Funcionarios
#Código
public static DataTable ListaFuncionarios()
        {
            string strSql = ("select a.ID_Func as ID, a.Nome_Func as Nome, a.Nr_Reg as 'Nº Registro', a.Ramal_Func as Ramal, c.nome_area as Área, d.nome_cargo as Cargo, b.Nome_Empregador as Empregador, a.DT_Adm as 'Data de Admissão', a.HR_Entra as 'Hr Entra', a.HR_Sai as 'Hr Sai', a.DT_Nasc as 'Data Nascimento', a.DT_Ultima_Atu as Atualizado_em from Funcionarios a, Empregador b, AreaFunc c, CargoFunc d where a.Empregador_Func = b.id_Empregador and a.Area_Func = c.id_area and a.Cargo_Func = d.id_Cargo order by Nome_Func");

            SqlConnection conn = ConetaBD.AbreConn();

            SqlCommand cmdListar = new SqlCommand(strSql, conn);

            cmdListar.CommandType = CommandType.Text;

            SqlDataAdapter da = new SqlDataAdapter(cmdListar);

            DataTable Lista = new DataTable();

            da.Fill(Lista);

            return Lista;
        }//fim do metodo


Minhas classes possuem apenas metodos, não sei se isso interfere em algo. Não estou utilizando atributos nas classes por não consegui utiliza-los, para eu utilizar os atributos da classe no metodo, eu não posso deixar o metodo como STATIC, e se o metodo não for STATIC eu não consigo utilizar ele na aplicação. Mas acho esse assunto pode esperar um pouco... rss
Att.,

Post mais votado

Jothaz
   - 17 nov 2015

Esse código funciona?

Normalmente uso assim:

#Código

    <Columns>
        <asp:BoundField DataField="Nome" HeaderText="Customer Name" />

      <asp:BoundField HeaderText="Data" DataField="Data de Admissão"  DataFormatString="{0:dd/MM/yy}">

...
...
..




Outra forma e formatar no próprio SQL, não acho a melhor, pois formatando no grid você pode mudar de bd que vai funcionar, se formatar direto no SQL não.

#Código
.. .... CONVERT(VARCHAR(10),a.DT_Adm ,103) as 'Data de Admissão'.....

Jothaz
   - 17 nov 2015

#Código

<asp:BoundField HeaderText="Data" DataField="SuaData" 
 DataFormatString="{0:dd/MM/yy}">


#Código
           <ItemTemplate>
                <%# DataBinder.Eval(Container.DataItem, "sua_sata", "{0:dd/MM/yyyy}")%>
            </ItemTemplate>
        </asp:TemplateField>

Ricardo
   - 17 nov 2015

Jothaz, onde eu coloco esses códigos?

O código do meu grid view é:

#Código

<asp:GridView ID="GridPrincipal" runat="server" BackColor="LightGoldenrodYellow" BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" OnSelectedIndexChanged="GridPrincipal_SelectedIndexChanged">
            <AlternatingRowStyle BackColor="PaleGoldenrod" />
            <Columns>
                <asp:CommandField ButtonType="Button" ShowSelectButton="True" />
            </Columns>
            <FooterStyle BackColor="Tan" />
            <HeaderStyle BackColor="Tan" Font-Bold="True" />
            <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
            <SortedAscendingCellStyle BackColor="#FAFAE7" />
            <SortedAscendingHeaderStyle BackColor="#DAC09E" />
            <SortedDescendingCellStyle BackColor="#E1DB9C" />
            <SortedDescendingHeaderStyle BackColor="#C2A47B" />
        </asp:GridView>


tentei adicionar o seu código dentro do código do meu grid view, mas ele reclamou...

No meu caso o DataField ficaria = "Data", por que é o nome da coluna que esta vinculada ao banco de dados, certo?

Att.,

Ricardo
   - 17 nov 2015

Sim, foi o código gerado pelo visual studio.

grid (Clique na imagem para abrir em uma nova janela)

Adicionei as duas linhas no código
#Código

 <asp:GridView ID="GridPrincipal" runat="server" BackColor="LightGoldenrodYellow" BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" OnSelectedIndexChanged="GridPrincipal_SelectedIndexChanged">
            <AlternatingRowStyle BackColor="PaleGoldenrod" />


            <Columns>
                <asp:CommandField ButtonType="Button" ShowSelectButton="True"/>
                <asp:BoundField DataField="Nome" HeaderText="Customer Name" />
                <asp:BoundField HeaderText="Data" DataField="Data de Admissão"  DataFormatString="{0:dd/MM/yy}">
            </Columns>


            <FooterStyle BackColor="Tan" />
            <HeaderStyle BackColor="Tan" Font-Bold="True" />
            <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
            <SortedAscendingCellStyle BackColor="#FAFAE7" />
            <SortedAscendingHeaderStyle BackColor="#DAC09E" />
            <SortedDescendingCellStyle BackColor="#E1DB9C" />
            <SortedDescendingHeaderStyle BackColor="#C2A47B" />
        </asp:GridView>


E deu o seguinte erro:
#Código
Server Error in '/' Application.

Parser Error

Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. 

Parser Error Message: Content ('</Columns>') does not match any properties within a 'System.Web.UI.WebControls.BoundField', make sure it is well-formed.

Source Error: 


Line 19:  
Line 20:                 <asp:BoundField HeaderText="Data" DataField="Data de Admissão"  DataFormatString="{0:dd/MM/yy}">
Line 21:             </Columns>
Line 22:             <FooterStyle BackColor="Tan" />
Line 23:             <HeaderStyle BackColor="Tan" Font-Bold="True" />

Source File: /CadFunc.aspx    Line: 21 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34280


Já tentei formatar o grid view de varias maneiras e nenhuma deu certo ainda...

Jothaz
   - 17 nov 2015

Estou sem acesso a IDE do Visual Studio no momento, então pode ser que os códigos que postar possam conter erros.

Feche a tag <asp:BoundField com />

#Código

<asp:BoundField HeaderText="Data" DataField="Data de Admissão"  DataFormatString="{0:dd/MM/yy}" />

Ricardo
   - 17 nov 2015

Jothaz agora funcionou.. valeu...

Só tem um problema, ele tirou da ordem as minhas colunas.. as 3 colunas setadas entre as tags <columns> foram para a frente, mas isso eu consigo acertar aqui.

Eu tenho que criar um BoundField para cada coluna, ou tem uma outra maneira de deixar as colunas na ordem que eu coloquei no select?

Mais uma vez obrigado! me ajudou muito!!!

Ricardo
   - 17 nov 2015

Jothaz agora funcionou.. valeu...

Só tem um problema, ele tirou da ordem as minhas colunas.. as 3 colunas setadas entre as tags <columns> foram para a frente, mas isso eu consigo acertar aqui.

Eu tenho que criar um BoundField para cada coluna, ou tem uma outra maneira de deixar as colunas na ordem que eu coloquei no select?

Mais uma vez obrigado! me ajudou muito!!!

Jothaz
   - 17 nov 2015

BoundField ou TemplateField/ItemTemplate depende de você.
Ou use o convert na execuçaõ do SQL.

Ricardo
   - 18 nov 2015

Jothaz, pensei que tinha resolvido o problema mas não resolveu totalmente...

Com o BoundField ele repete a coluna, a coluna fica duplicada no grid, fica a coluna do BoundField e a coluna do DataTable.

Usei o convert no select, a exibição ficou perfeita, porem ele não carrega o valor da data no text box para eu realizar o update.

Eu defini meu text box como date, para ajudar o usuário na hora do preenchimento...

#Código

<asp:TextBox ID="txtDataAdm" runat="server" style="margin-bottom: 0px" TextMode="Date"></asp:TextBox>


Pra mim tanto faz usar a formatação da data no SQL ou no grid, por que no meu caso o banco vai ser SQL mesmo. Mas sei que seria melhor utilizar a formatação no grid.

Se eu não conseguir converter a data no grid agora, eu faço pelo SQL mesmo (que é mais fácil) e depois volto nisso.

Abs...

Jothaz
   - 18 nov 2015

Olha estou sem acesso a IDE do Visual Studio então complica um pouco a ajuda.

Pelo que me lembre existe um atributo na propriedade do Gridview em que você define se será gerado automaticamente as colunas ou não.
Se forusar o o BoundField ou TemplateField/ItemTemplate você de colocar o atributo allowgeneratecolumnn ou autogeneratecolumnn (ou algo assim como false.

Ai é só colocar todos os campo no BoundField ou TemplateField/ItemTemplate.

Agora exista a solução convert, que no seu caso pode ser utilizada.

Ricardo
   - 18 nov 2015

Jothaz, era isso mesmo, eu tinha esquecido de alterar essa propriedade.

Mas as datas não estão sendo carregadas nos text box, mas parece que eu tenho que carregar esses valores via data set e não diretamente do grid, o grid só vai passar a posição do registro.

Obrigado!!!

Jothaz
   - 18 nov 2015

Fica quase impossível opinar se entender ou ver a aplicação funcionando.

Sinceramente não entendi qual seria o uso TextBox, seria para entrada de dados no grid?

Mas existe um método GridView.RowDataBound que é disparado na criação da linha do grid onde pode-se recuperar os dados da lista e usá-los da forma que quiser.

Posso estar falando uma grande bobagem, mas as cegas só posso ajudar com conjecturas.

Ricardo
   - 18 nov 2015

Os text box são usados no INSERT e UPDATE no banco.

Os text box são salvar os dados no banco, para um novo funcionario está funcionando.

Porem se eu preciso fazer alguma alteração no cadastro desse funcionário, quando eu mando tirar os dados do grid e colocar cada coluna no text box correspondente, as datas não vão, todas as outras colunas vão para o seu text box.

eu coloquei um botão no inicio do grid para selecionar a linha que eu quero alterar, fui nas propriedades dele e adicionei uma coluna, não sei se essa é a maneira correta de fazer isso, mas foi a unica q encontrei...

Os text box das datas estão definidos como TextMod = "DATE", se eu deixar eles não colocar isso, eles funcionam tbm. O problema está com o tipo do text box.

Ricardo
   - 18 nov 2015

Os text box são usados no INSERT e UPDATE no banco.

Os text box são salvar os dados no banco, para um novo funcionario está funcionando.

Porem se eu preciso fazer alguma alteração no cadastro desse funcionário, quando eu mando tirar os dados do grid e colocar cada coluna no text box correspondente, as datas não vão, todas as outras colunas vão para o seu text box.

eu coloquei um botão no inicio do grid para selecionar a linha que eu quero alterar, fui nas propriedades dele e adicionei uma coluna, não sei se essa é a maneira correta de fazer isso, mas foi a unica q encontrei...

Os text box das datas estão definidos como TextMod = "DATE", se eu deixar eles não colocar isso, eles funcionam tbm. O problema está com o tipo do text box.

Jothaz
   - 18 nov 2015

Sou meio burro então ainda fica confuso, mas já pensou em retirar TextMod = "DATE" e utilizar alguma mascara em JavaScript como o JQuery.

Ricardo
   - 18 nov 2015

Cheguei nessa parte da aplicação agora, eu estava fazendo as classes e montando os metodos das classes, antes eu estava testando com o text box padrão (SingleLine), e funcionava.

Depois vou ver uma mascara, vou precisar de uma para CNPJ também.

Queria fazer uma coisa bem simples, por que a principio essa aplicação seria apenas para fazer atualizações na lista de ramais e aniversariantes do mês que ficam na intranet da empresa, eu que estou querendo colocar outras funções nela.

Mas também não sei se vou conseguir exibir esse grid view na intranet, ela é feita em sharepoint, depois q essa primeira parte da aplicação ficar pronta vou tentar exibir o grid na intranet.

O maior problema que enfrentei até agora foi querer fazer tudo utilizando o C#, não estava querendo vir para o outro lado, mas depois vou precisar ver algumas coisas em ASP ou Javascript tbm, não só para as mascaras, pois quero colocar uns pop ups.... tipo "Salvo com sucesso!!!" e um que vai mostrar os aniversariantes do dia assim que um funcionario abrir a intranet.

Comecei a mexer nisso meio que de curioso, e acho que não sei perguntar o que eu quero saber,,,rss não sei explicar direito o que quero.

Como eu disse no inicio, eu não sei quase nada sobre isso, estou procurando fazer da maneira correta.

Você me ajudou bastante com a exibição dos dados no grid view.

Jothaz
   - 18 nov 2015

Usando WebForms não é possível criar uma solução robusta usando somente C#. Windowsform aindavai mas Web você vai ter que apela para outras tecnologias.

Eu na minha ignorância recomendo o jQuery MaskEdit que simples e muito robusto. Veja um exemplo funcional .

Agora só você conhece seus pontos forte e fracos e sabe qual melhor caminho a seguir.

Ricardo
   - 19 nov 2015

Muito legal esse site que você passou, com certeza vou aproveitar algumas coisas.

o JQuery pode ser a saída os pop ups, vi uns exemplos e não parece ser muito complicado a criação de pop up.

Tentei rodar rapidamente esses scripts mas não funcionou... não sei se a versão do jquery está correta, fiz conforme vi em um site, salvei o arquivo em C:\JQuery.

#Código

   <script type="text/javascript" src="jquery-1.11.3.js"></script>
   <script type="text/javascript">
       jQuery(function ($) {
           $.mask.definitions['~'] = '[+-]';
           $('#date').mask('99/99/9999');
           $('#phone').mask('(999) 999-9999');
           $('#phoneext').mask("(999) 999-9999? x99999");
           $("#tin").mask("99-9999999");
           $("#ssn").mask("999-99-9999");
           $("#product").mask("a*-999-a999", { placeholder: " ", completed: function () { alert("You typed the following: " + this.val()); } });
           $("#eyescript").mask("~9.99 ~9.99 999");
       });
    </script>

        <div id="demo">
    
    <h3>Masked Input Plugin.</h3>
    <p> </p>
    
    <table border="0"><tbody><tr>
        <td>Date</td><td><input id="date" type="text" tabindex="1" /></td>
        <td>99/99/9999</td></tr><tr><td>Phone</td><td><input
id="phone" type="text" tabindex="3" /></td><td>(999) 999-9999</td></tr><tr><td>Phone + Ext</td>
        <td><input id="phoneext" type="text" tabindex="4" /></td><td>(999) 999-9999 x99999 (optional ext)</td></tr><tr><td>Tax ID</td>
        <td><input id="tin" type="text" tabindex="5" /></td><td>99-9999999</td></tr><tr><td>SSN</td><td><input
id="ssn" type="text" tabindex="6" /></td><td>999-99-9999</td></tr><tr><td>Product Key</td>
        <td><input id="product" type="text" tabindex="7" /></td><td>a*-999-a999</td></tr><tr><td>Eye Script</td>
        <td><input id="eyescript" type="text" tabindex="8" /></td><td>~9.99 ~9.99 999</td>
    
        </tr></tbody></table>

        </div>


O formulário aparece na tela, mas as mascaras não.

Tentei com o script do jquery no <head> também e acontece a mesma coisa...

Jothaz
   - 19 nov 2015

Apesar do jQuery ser muito simples requer uma curva de aprendizado com muita pesquisa e entendimento de como funciona, infelizmente nem sempre basta somente colar e copiar.

O ideal e deixar a referencia ao jQuery na tag Head:

#Código

<head>
	<script type="text/javascript" src="jquery-1.11.3.js"></script>
</head>


Normalmente colocamos os arquivos do jQuery na pasta do projeto em um subpastas "script" e depois fazemos a referência. Mas cada especialista configura seu ambiente de acordo com suas preferencias, experiencia e conhecimento.

Aconselho e é somente um conselho que antes de adotar qualquer solução e ir incluindo no seu código tente entender mais a fundo como as coisas funcionam, isso poupará muito tempo, transtornos e frustrações.

Acho que é com o que posso contribuir, no mais bons estudos e boa sorte.

Ricardo
   - 19 nov 2015

Foi apenas um teste rápido, por isso copiei e colei e um projeto de teste.

Quando eu começar a acertar o layout da página e demais funcionalidades que vão alem do C#, vou me aprofundar nesse assunto.

Obrigado pela a ajuda e principalmente pela paciência!