Pregunta

Tengo una página ASP.Net muy simple que actúa como interfaz para un procedimiento almacenado. Simplemente ejecuta el procedimiento y muestra la salida utilizando un control de vista de cuadrícula: menos de 40 líneas de código total, incluido el marcado aspx. El procedimiento almacenado en sí es muy ... volátil. Se utiliza para varios propósitos y el formato de salida cambia regularmente.

Todo funciona bien, porque el control de gridview no tiene que preocuparse realmente de qué columnas devuelve el procedimiento almacenado: solo las muestra en la página, que es exactamente lo que quiero.

Sin embargo, la base de datos con la que se ejecuta tiene una cantidad de columnas de fecha y hora en todo el lugar donde la parte del tiempo no es realmente importante, siempre se pone a cero. Lo que me gustaría poder hacer es controlar el formato de solo las columnas de fecha y hora en la vista de cuadrícula, sin saber exactamente qué columnas serán esas. Cada vez que una columna en los resultados tiene un tipo de fecha y hora, simplemente aplique una cadena de formato dada que recorte el componente de tiempo.

Sé que podría convertir a una varchar en la base de datos, pero realmente no quiero tener que preocupar a los desarrolladores por el formateo en la consulta y esto pertenece al nivel de presentación de todos modos. ¿Alguna otra idea?


Finalmente conseguí que esto funcionara de una manera aceptable (o al menos mejorada) 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
¿Fue útil?

Solución

Si está generando automáticamente las columnas, suena como si lo fuera. El procedimiento para usar el formato de cuadrículas es horrible.

Necesitarías recorrer todas las columnas de la cuadrícula, probablemente en el evento de base de datos y aplicar una expresión de formato a cualquier columna que encuentres en una columna de fecha.

Si no está generando automáticamente y tiene columnas de codificación en su cuadrícula, también sabrá qué columnas son columnas de fecha y puede aplicar la misma expresión de formato a esa columna. Es algo así como {0: ddMMyyyy} pero tendrás que buscarlo ya que probablemente no esté del todo bien.

para resumir el gancho en el evento de base de datos. recorra la colección de columnas y compruebe si la columna es una columna de fecha. Me pregunto cómo podrías hacer esto :). Si decide que una columna es una columna de fecha, establezca su expresión de formato.

Voila

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

Bien, ¿qué tal si escribes tu método que devuelve los datos del proceso para devolver un datatable? Puede enlazar el datatable a su grilla después de formatear los datos en el datatable. La colección datatable.Columns es una colección de DataColumns y éstas tienen una propiedad DataType. Puede que estés buscando System.DateTime o DateTime y puede ser una de las propiedades de la propiedad DataType :) Sé que es engorroso, pero lo que estás preguntando definitivamente será engorroso. Una vez que haya identificado las columnas de fecha, es posible que pueda hacer algo con ella.

Si no, empezaría a mirar los lectores de datos y vería si hay algo que puedas hacer allí o con adaptadores de datos. Desearía poder darte una respuesta adecuada, pero creo que, sin embargo, si logras hacerlo, no va a ser bonito. Lo siento

Otros consejos

Si usar columnas enlazadas explícitas es una opción, agregue un DataFormatString a su boundField

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

de lo contrario, podría ver cómo se realiza el formateo del evento GridView.OnRowDataBound

Puedes usar la función isDate () para ver si algo es una fecha válida y luego usar las opciones de formato de fecha para que parezca que deseas.

Algunos ejemplos para el formateo de fechas: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.ata> >

scroll top