buon giorno a tutti..
ho un problema di ordinamento con una particolare condizione di colonna in datagridview..
la griglia è così composta da 4 colonne:
praticamente quando l'utente clicca sulla cella d'intestazione colonna, l' ordinamento varia asseconda della colonna relativa, ed eseguo questo tramite un select case nel codice di sortcompare. In particolare la colonna 2 (Immagine) deve ordinare secondo i valori contenuti nella colonna nascosta "ID".. è qui nasce il mio problema perchè non ordina nulla...codice:1: DataGridViewTextBoxColumn, nome : "ID" <-- colonna nascosta contiene l'indentificativo della manutenzione ( numero crescente in ordite creazione temporale dell'istanza) 2: DataGridViewImageBoxColumn, nome: "Immagine" <-- contiene l'icona/foto della manutenzione 3: DataGridViewTextBoxColumn, nome: "Elenco_Man" <-- Contiente tutte le manutenzioni (testo formattato) 4: DataGridViewTextBoxColumn, nome: "Prossima_Man" <-- contiente la prossima prevista manutenzione in (testo formattato)
questo è il codice nell'evento SortCompare :
per ora tralascio il caso delle ultime due colonne (testo piccolo) ed evidenziato il codice per le prime 3 colonne di cui in rosso quella incriminata:
il caso di "Immagine" tiene conto dei valori della colonna "ID" ma non ordina nulla..ho controllato tramite debug è i valori che vengono comparati sono giusti ed addirittura e.SortResult assume la giusta comparazione ...com'è possibile che non va? eppure non è la prima volta che faccio una cosa del genere anche più complesse di questa..??codice:Private Sub Grid_SortCompare(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewSortCompareEventArgs) Handles GridData.SortCompare With GridData Select Case e.Column.Name Case "ID" ' l'ho inserito per fare una prova rendendo visibile la colonna e.SortResult = String.Compare(e.CellValue1, e.CellValue2) Case "Immagine" e.SortResult = String.Compare(.Rows(e.RowIndex1).Cells("ID").Value, .Rows(e.RowIndex2).Cells("ID").Value) Case "Voce" e.SortResult = String.Compare(e.CellValue1, e.CellValue2) Case "Lista_Man" Dim KM As New List(Of Long), D As New List(Of Object) For Each n As Byte In {1, 2} Dim i As Byte = 0, V() As String = Split(Microsoft.VisualBasic.Switch(n = 1, LCase(e.CellValue1), n = 2, LCase(e.CellValue2)), "(") Dim _KM As Long = 0, _D As Object = "" If InStr(V(i), "il") > 0 Then _D = Trim(Strings.Right(V(i), Len(V(i)) - (InStr(V(i), "il") + 2))) i += 1 End If If Not IsDate(_D) Then _D = DateTime.FromOADate(0) Else _D = CDate(_D) If InStr(V(i), "km") > 0 Then _KM = GetKM(V(i)) KM.Add(_KM) : D.Add(_D) Next n e.SortResult = KM(0) - KM(1) Case "Prossima_Man" Dim V1() As String = Split(e.CellValue1, vbCrLf) Dim V2() As String = Split(e.CellValue2, vbCrLf) Dim KM1 As Integer = 0, KM2 As Integer = 0 For Each El1 As String In V1 If El1.Contains("km") Then KM1 = GetKM(El1) : Exit For Next : If KM1 <= 0 Then KM1 = 999999 For Each El2 As String In V2 If El2.Contains("km") Then KM2 = GetKM(El2.Replace("a: ", "")) : Exit For Next : If KM2 <= 0 Then KM2 = 999999 e.SortResult = KM1 - KM2 End Select End With End Sub![]()
ho fatto una marea di altre prove, alla fine ho scoperto che il problema si presenta proprio quando nel codice di comparazione utilizzo variabili diverse da e.CellValue1 e e.CellValue2... praticamente il codice viene eseguito correttamente (testimonia il debug) ma alla fine è l'ordirnamento lo fa sempre e comunque come se tenesse conto della comparazione dei valori di e.CellValue1 e e.CellValue2 (cioè come se il codice in sortcompare non venisse eseguito)... non è stranissima questa cosa??![]()
bhu .. da manicomio![]()
per cortesia se qualcuno sa risolvere questo problema, prego e ringrazio da subito!
GRAZIE

Rispondi quotando