Question

J'ai une page ASP.Net très simple qui fait office de serveur frontal pour une procédure stockée. Il exécute simplement la procédure et affiche la sortie à l'aide d'un contrôle gridview: moins de 40 lignes de code total, y compris le balisage aspx. La procédure stockée elle-même est très ... volatile. Il est utilisé à plusieurs fins et le format de sortie change régulièrement.

Tout fonctionne très bien, car le contrôle gridview n'a pas vraiment besoin de se soucier des colonnes renvoyées par la procédure stockée: il les affiche simplement sur la page, ce qui est exactement ce que je veux.

Cependant, la base de données sur laquelle elle s'exécute comporte un certain nombre de colonnes date-heure partout où la partie heure n'est pas vraiment importante, elle est toujours mise à zéro. Ce que j'aimerais pouvoir faire, c’est contrôler la mise en forme des colonnes datetime uniquement dans la vue en grille, sans jamais savoir précisément de quelles colonnes il s’agit. Chaque fois qu'une colonne dans les résultats a un type datetime, appliquez simplement une chaîne de format donnée qui coupera le composant time.

Je sais que je pourrais me convertir en varchar dans la base de données, mais je ne voudrais vraiment pas que les développeurs se soucient de la mise en forme dans la requête, ce qui appartient quand même au niveau de la présentation. D'autres idées?

Enfin, cela fonctionne de manière acceptable (ou du moins améliorée) en utilisant ce code:

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
Était-ce utile?

La solution

Si vous générez automatiquement les colonnes, cela ressemble à vous. La procédure d'utilisation du formatage des grilles est terrible.

Vous devez parcourir toutes les colonnes de la grille, probablement dans l'événement databound, et appliquer une expression de mise en forme à toute colonne trouvée. Il s'agit d'une colonne de date.

Si vous ne générez pas automatiquement et que vous codez des colonnes dans votre grille, vous saurez déjà quelles colonnes sont des colonnes de date et vous pouvez appliquer la même expression de format à cette colonne. C'est quelque chose comme {0: ddMMyyyy} mais vous devrez le rechercher car ce n'est probablement pas tout à fait correct.

donc pour résumer le lien dans l'événement databound. parcourez la collection de colonnes et déterminez si la colonne est une colonne de date. Je me demande comment tu pourrais faire ça :). Si vous décidez qu'une colonne est une colonne de date, définissez son expression de format.

Voila

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

Ok, que diriez-vous d’écrire votre méthode qui renvoie les données du proc pour renvoyer une donnée. Vous pouvez lier le datatable à votre grille après le formatage des données dans le datatable. La collection datatable.Columns est une collection de DataColumns et ceux-ci ont une propriété DataType. Vous recherchez peut-être System.DateTime ou DateTime et il peut s'agir d'une des propriétés de la propriété DataType elle-même :). Je sais que c'est lourd, mais ce que vous demandez va certainement être lourd. Une fois que vous avez identifié les colonnes de date, vous pourrez peut-être faire quelque chose avec.

Sinon, je commencerais par regarder les lecteurs de données et voir si vous pouviez y faire quelque chose ou avec des adaptateurs de données. J'aimerais pouvoir vous donner une réponse appropriée, mais je pense que, même si vous réussissez à le faire, ça ne va pas être joli. Désolé

Autres conseils

si l'utilisation de colonnes liées explicites est une option, ajoutez un DataFormatString à votre boundField

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

sinon, vous pourriez envisager de formater l'événement GridView.OnRowDataBound

Vous pouvez utiliser la fonction isDate () pour voir si une date est valide, puis utiliser les options de dateformatting pour lui donner l’impression que vous voulez.

Quelques exemples de formatage de date: >

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top