Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Ordinamento colonna data in datagridview
Forum - C# / VB.NET - Ordinamento colonna data in datagridview

Avatar
M4tRiX83 (Normal User)
Rookie


Messaggi: 31
Iscritto: 09/05/2008

Segnala al moderatore
Postato alle 15:26
Venerdì, 20/02/2009
Questo topic è stato chiuso dal moderatore

Ciao ragazzi,
ho un problema nella gestione di una colonna contenente dei dati di tipo "date" all'interno di un datagridview:
nel database, le date sono inserite nel formato 'yyyy-mm-dd' invece, quando le inserisco nel datagridview, per una migliroe lettura le ho formattate in questo modo: 'dd-mm-yyyy'.
Il problema si presenta quando si va ad ordinare la griglia in base a questa colonna perché le date vengono visualizzate in ordine di giorno e non di data, cosa che invece avverrebbe correttamente se la data fosse inserita partendo dall'anno ('yyyy-mm-dd').

Sapreste indicarmi una soluzione per poter permettere il corretto ordinamento di quella colonna mantenedo però la formattazione 'dd-mm-yyyy'??

Grazie mille come sempre e buon week-end a tutti!!!

P.S. Spero di aver esposto in modo chiaro il mio problema..

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:27
Sabato, 21/02/2009
Puoi farlo in due modi:

1. Crei una classe comprarer che confronti le righe, e poi la passi come argomento al metodo Sort della DataGridView. Ad esempio:
Codice sorgente - presumibilmente VB.NET

  1. Public Class DataCellDateComparer
  2.     Implements IComparer
  3.  
  4.     Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
  5.         Dim R1 As DataGridViewRow = DirectCast(x, DataGridViewRow)
  6.         Dim R2 As DataGridViewRow = DirectCast(y, DataGridViewRow)
  7.         Dim D1 As Date = Date.Parse(R1.Cells(1).Value.ToString)
  8.         Dim D2 As Date = Date.Parse(R2.Cells(1).Value.ToString)
  9.  
  10.         Return Date.Compare(D1, D2)
  11.     End Function
  12. End Class
  13.  
  14. '...
  15.  
  16. DataGridView1.Sort(New DataCellDateComparer())


Per ulteriori informazioni su IComparer:
http://totem.altervista.org/guida/versione2/A37.php

2. In alternativa, puoi richiamare normalmente il metodo Sort, ed effettuare la comparazione nell'evento SortCompare:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub DataGridView1_SortCompare(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
  2.     If e.Column.Index = 1 Then
  3.         e.SortResult = Date.Compare(Date.Parse(e.CellValue1.ToString), Date.Parse(e.CellValue2.ToString))
  4.         e.Handled = True
  5.     Else
  6.         'e.Handled=False significa che lasciamo la comparazione
  7.         'alla datagridview
  8.         e.Handled = False
  9.     End If
  10. End Sub
  11.  
  12. '...
  13.  
  14. DataGridView1.Sort(DataGridView1.Columns(1), System.ComponentModel.ListSortDirection.Ascending)


In entrambi ho presupposto che la cella con la data fosse la seconda (indice 1).

PM
Avatar
M4tRiX83 (Normal User)
Rookie


Messaggi: 31
Iscritto: 09/05/2008

Segnala al moderatore
Postato alle 14:11
Domenica, 22/03/2009
Ciao,
ho fatto un sacco di prove ma ancora non sono riuscito a risolvere il mio problema.

Gli esempi che mi hai indicato mi sono stati utilissimi anche per imparare argomenti  che non conoscevo, però ancora non sono riuscito ad ottenere il risultato che mi servirebbe perché:
utilizzando il primo metodo mi viene generata un'eccezione perché il mio datagrid view viene popolato tramite un datasource.
E per lo stesso motivo, leggendo sulla MSDN, ho notato che anche l'evento sortcompare non viene generato.

Se ti viene in mente, potresti aiutarmi a trovare una soluzione alternativa?

Per il momento ti ringrazio già un sacco per le info che mi hai dato.

Buona domenica.

Ultima modifica effettuata da M4tRiX83 il 22/03/2009 alle 14:12
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:08
Lunedì, 23/03/2009
Sono gli unici modi che conosco e... perchè hai risposto dopo un mese?

PM
Avatar
M4tRiX83 (Normal User)
Rookie


Messaggi: 31
Iscritto: 09/05/2008

Segnala al moderatore
Postato alle 21:03
Lunedì, 23/03/2009
Come sei curioso.....skerzo.. :-p

..cmq ci ho messo tanto a rispondere perché dove lavoro sono l'unico ke si occupa della sviluppo IT e devo portare avanti diversi progetti in parallelo....scusami dai :-)

..ma anke a te risulta ke l'interfaccia IComparer ed il metodo SortCompare possono essere utilizzata solo se non ci si appoggia a un DataSource o sono io ke nn ci riesco??

..documentandomi ho visto ke una soluzione si potrebbe trovare utilizzando la virtual mode..xò devo approfondire..pensi ke sia una trada percorribile??

Grazie neh..come sempre :-)

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:21
Domenica, 29/03/2009
In realtà vedo poca attinenza con la Virtual Mode: questa proprietà, se attiva, serve per gestire efficientemente grandi quantità di dati (dell'ordine dei milioni).
Se non riesci ad ordinare la datagridview, prova ad ordinare il datasource (dovrebbe esporre metodi simili).

PM
Avatar
M4tRiX83 (Normal User)
Rookie


Messaggi: 31
Iscritto: 09/05/2008

Segnala al moderatore
Postato alle 21:36
Martedì, 14/04/2009
Ciao,
finalmente sono arrivato alla soluzione del problema, la riporto, così se quanlcun altro si troverà di fronte ad un problema simile può trarne spunto:
mi sono appoggiato all'evento "CellFormatting" del DatagridView e, per ogni cella appartenente alle colonne contenenti le date ho eseguito una conversione al formato data e una formattazione 'dd-MM-yyyy':

Codice sorgente - presumibilmente VB.NET

  1. Private Sub dg1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dg1.CellFormatting
  2.         'Converte i valori di determinate colonne (Data_Iniziale e Data_Finale) in tipo Data (per permettere l'ordinamento)
  3.         Dim _tmp_dg1 As DataGridView
  4.  
  5.         _tmp_dg1 = CType(sender, DataGridView)
  6.  
  7.         If _tmp_dg1.Columns(e.ColumnIndex).Name = "Data_Iniziale" Or _tmp_dg1.Columns(e.ColumnIndex).Name = "Data_Finale" Then
  8.             e.Value = Date.Parse(e.Value.ToString).ToString("dd-MM-yyyy")
  9.         End If
  10.  
  11.     End Sub




"Il Totem" ti ringrazio per l'aiuto che mi hai dato..buona serata a tutti :-)

PM