Pergunta

Eu tenho uma página muito simples ASP.Net que atua como um front-end para um procedimento armazenado. É apenas executa o procedimento e mostra a saída utilizando um controle gridview: menos do que 40 linhas de código totais, incluindo aspx marcação. O procedimento armazenado em si é muito ... volátil. Ele é usado para uma série de propósitos e o formato de saída muda regularmente.

A coisa toda funciona muito bem, porque o controle gridview realmente não precisa de cuidados que colunas o procedimento armazenado retornará:. Isso só mostra-los na página, que é exatamente o que eu quero

No entanto, o banco de dados isto corre contra tem uma série de data e hora colunas em todo o lugar onde a parte do tempo não é realmente importante- é sempre zerado. O que eu gostaria de ser capaz de fazer é controlar a formatação de apenas as colunas de data e hora na gridview, sem nunca saber exatamente quais colunas aqueles será. Toda vez que uma coluna nos resultados tem um tipo de data e hora, basta aplicar uma determinada cadeia de formato que irá cortar fora o componente de tempo.

Eu sei que poderia converter em um varchar no banco de dados, mas eu realmente não quero ter que fazer os desenvolvedores se preocupam com a formatação na consulta e este pertence ao nível da apresentação de qualquer maneira. Quaisquer outras ideias?


Finalmente, com este trabalho numa aceitável (ou pelo menos melhorada) forma usando este código:

Protected Sub OnRowDatabound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim d As DateTime
        For Each cell As TableCell In e.Row.Cells
            If Date.TryParse(cell.Text, d) AndAlso d.TimeOfDay.Ticks = 0 Then
                cell.Text = d.ToShortDateString()
            End If
        Next cell
    End If
End Sub
Foi útil?

Solução

Se você é auto gerando as colunas que parece que você está. O procedimento para utilizar as grades formatação é horrível.

Você precisa percorrer todas as colunas da grade, provavelmente, em caso de ligação de dados e aplicar uma expressão formatação a qualquer coluna que você encontra é uma coluna de data.

Se você não está gerando auto e você está hadcoding colunas em sua grade você também vai saber alreayd quais colunas são colunas de data e você pode aplicar a mesma expressão formato para essa coluna. É algo como {0: DDMMAAAA}. Mas você vai ter que procurá-lo como isso é provavelmente não muito bem

Assim, para resumir ligar para o evento de ligação de dados. loop através da recolha de coluna e verificar se a coluna é uma coluna de data. Eu me pergunto como você pode fazer isso :). Se você decidir uma coluna é uma coluna de data definida sua expressão formato.

Voila

---------------------- EDIT

Ok como sobre você escreve você método que retorna os dados do proc para retornar uma tabela de dados. Você pode vincular a tabela de dados para sua grade após a formatação dos dados na tabela de dados. A coleção datatable.Columns é uma colecção de DataColumns e estes têm uma propriedade DataType. Você pode estar procurando System.DateTime ou DateTime e pode ser uma das propriedades da própria propriedade DataType :). Eu sei que é complicado, mas o que você está pedindo é definitivamente vai ser complicado. Depois de identificar colunas de data que você pode ser capaz de fazer algo com ele.

Se não eu iria começar a olhar para os leitores de dados e ver se há alguma coisa que você pode fazer lá ou com adaptadores de dados. Eu gostaria de poder lhe dar uma resposta adequada, mas eu acho que no entanto você conseguir fazê-lo, não vai ser bonita. Desculpe

Outras dicas

Se o uso de colunas ligadas explícitas é uma opção, adicione um DataFormatString ao seu BoundField

<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ > 

caso contrário você pode olhar para fazer a formatação do evento GridView.OnRowDataBound

Você pode usar a função IsDate () para ver se algo é uma data válida e, em seguida, usar dateformatting opções para fazer parecer que você quer.

Alguns exemplos de data formatação: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top