2008-10-30 4 views
1

J'ai une page ASP.Net très simple qui fait office de 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.Colonnes de format pour ASP.Net GridView basé sur le type de données

Le tout fonctionne très bien, car le contrôle gridview n'a pas vraiment besoin de se soucier des colonnes que la procédure stockée retourne: il les affiche juste 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 datetime partout où la partie de temps n'est pas vraiment importante - elle est toujours mise à zéro. Ce que j'aimerais pouvoir faire, c'est contrôler le formatage des seules colonnes datetime dans la grille, sans jamais savoir exactement quelles colonnes elles seront. Chaque fois qu'une colonne dans les résultats a un type datetime, appliquez simplement une chaîne de format donnée qui va couper le composant time.

Je sais que je pourrais convertir en varchar à 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 et cela appartient au niveau de la présentation. D'autres idées?


a finalement obtenu ce travail dans un acceptable (ou au moins amélioré) manière 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 

Répondre

2

Si vous êtes auto générer les colonnes il semble que vous êtes. La procédure d'utilisation du formatage des grilles est horrible.

Vous devez parcourir toutes les colonnes de la grille, probablement dans l'événement databound, et appliquer une expression de formatage à toute colonne que vous trouvez est une colonne de date.

Si vous ne générez pas automatiquement et que vous avez des colonnes hadcoding dans votre grille, vous saurez également 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 hook dans l'événement de databound

parcourez la collection de colonnes et vérifiez 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 que vous écrivez méthode qui renvoie les données du proc renvoyer un datatable. 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 pouvez rechercher System.DateTime ou DateTime et il peut être l'une des propriétés de la propriété DataType elle-même :). Je sais que c'est lourd, mais ce que vous demandez est définitivement lourd. Une fois que vous avez identifié les colonnes de date, vous pourrez peut-être faire quelque chose avec.Si ce n'est pas je commence à regarder les lecteurs de données et voir si vous pouvez faire quelque chose que vous pouvez faire ici ou avec des adaptateurs de données. J'aimerais pouvoir vous donner une bonne réponse, mais je pense que, même si vous réussissez à le faire, ça ne va pas être joli. Désolé

+0

Cela semble correcte: je Je vais attendre un peu plus longtemps avant d'afficher ou d'accepter pour que la question reste un peu plus longtemps sur l'onglet sans réponse, mais je reviendrai vers vous. –

+0

Ok, j'ai joué avec ça maintenant. Bon effort, mais je ne peux pas trouver un moyen d'obtenir le type d'une colonne dans le contrôle au moment de l'exécution, et même si je ne pouvais pas trouver où placer une expression de format. –

+0

Fait un montage d'une autre idée que je viens de composer :). GL. – Robert

2

si vous utilisez des colonnes liées explicites est une option, ajouter un DataFormatString à votre BoundField

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

sinon vous pouvez regarder faire la mise en forme de l'événement GridView.OnRowDataBound

Questions connexes