Formattare le colonne per ASP.Net GridView in base al tipo di dati
-
05-07-2019 - |
Domanda
Ho una pagina ASP.Net molto semplice che funge da front-end per una procedura memorizzata. Esegue solo la procedura e mostra l'output utilizzando un controllo gridview: meno di 40 righe di codice totale, incluso il markup aspx. La stessa procedura memorizzata è molto ... volatile. È utilizzato per vari scopi e il formato di output cambia regolarmente.
Il tutto funziona alla grande, perché il controllo gridview non ha davvero bisogno di preoccuparsi di quali colonne restituisce la procedura memorizzata: le mostra semplicemente sulla pagina, che è esattamente quello che voglio.
Tuttavia, il database su cui viene eseguito ha un numero di colonne datetime in tutto il luogo in cui la porzione di tempo non è davvero importante, viene sempre azzerata. Quello che vorrei poter fare è controllare la formattazione delle sole colonne del datetime nel gridview, senza mai sapere con precisione quali colonne saranno. Ogni volta che una colonna nei risultati ha un tipo datetime, basta applicare una determinata stringa di formato che taglierà il componente time.
So che potrei convertirmi in un varchar nel database, ma non vorrei davvero fare in modo che gli sviluppatori si preoccupassero della formattazione della query e questo appartiene comunque al livello di presentazione. Altre idee?
Finalmente ha funzionato in modo accettabile (o almeno migliorato) usando questo codice:
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
Soluzione
Se stai generando automaticamente le colonne che sembra che tu sia. La procedura per utilizzare la formattazione delle griglie è terribile.
Dovresti scorrere tutte le colonne della griglia, probabilmente nell'evento databound e applicare un'espressione di formattazione a qualsiasi colonna che trovi sia una colonna di data.
Se non stai generando automaticamente e hai colonne di codifica nella tua griglia, saprai anche alreayd quali colonne sono colonne di date e puoi applicare la stessa espressione di formato a quella colonna. È qualcosa come {0: ddMMyyyy} ma dovrai cercarlo perché probabilmente non è del tutto corretto.
in modo da riassumere il hook nell'evento databound. scorrere la raccolta di colonne e accertarsi che la colonna sia una colonna di data. Mi chiedo come potresti farlo :). Se decidi che una colonna è una colonna di data imposta la sua espressione di formato.
Voila
---------------------- MODIFICA
Ok, che ne dici di scrivere il tuo metodo che restituisce i dati dal proc per restituire un datatable. È possibile associare il datatable alla griglia dopo aver formattato i dati nel datatable. La collezione datatable.Columns è una raccolta di DataColumns e questi hanno una proprietà DataType. Potresti cercare System.DateTime o DateTime e potrebbe essere una delle proprietà della proprietà DataType stessa :). So che è ingombrante ma quello che stai chiedendo sarà sicuramente ingombrante. Dopo aver identificato le colonne della data, potresti essere in grado di farci qualcosa.
Altrimenti inizierei a guardare i lettori di dati e vedere se c'è qualcosa che puoi fare lì o con adattatori di dati. Vorrei poterti dare una risposta adeguata, ma penso che comunque riuscirai a farlo, non sarà carino. Siamo spiacenti
Altri suggerimenti
se è possibile utilizzare colonne esplicite associate, aggiungere un DataFormatString al boundField
<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ >
altrimenti potresti guardare a formattare l'evento GridView.OnRowDataBound
Puoi usare la funzione isDate () per vedere se qualcosa è una data valida e quindi usare le opzioni di formattazione della data per farlo sembrare come desideri.
Alcuni esempi per la formattazione della data: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml