Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB2010 WinForms] DataGridView.SortCompare -ordinare comparando colonna diversa..

    buon giorno a tutti..

    ho un problema di ordinamento con una particolare condizione di colonna in datagridview..
    la griglia è così composta da 4 colonne:
    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)
    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...

    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:
    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
    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..??
    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
    Michele

  2. #2
    EDIT: rileggendo mi sono accorto che ho descritto 4 colonne anzichè 5...
    Non ha rilevanza, ma aggingo la 3^ colonna formato DataGridViewTextBoxColumn con nome "Voce" contiene il nome della manutenzione... Il codice invece è corretto..
    Michele

  3. #3
    Aiuto sto diventando pazzo per questo problema nessuno che è incappato in questa cosa??!!

    ho fatto un'ultima prova e dopo questa non so più che fare!

    ho creato da zero un nuovo progetto, semplicemente inserito un form e una datagridview con due colonne testo e avviato il progetto ho popolato manualmente la prima colonna con semplici numeri a caso 1,4,3,7,... la seconda colonna con numeri in ordine crescente da 10 in poi 10,11,12...(per testare il comportamento naturale di ordinamento)
    allora clicco per ordinare la prima colonna e tutto si ordina secondo i valori della prima colonna, clicco per ordinare la seconda colonna è come normalmnete accade ordina tutto secondo i valori della seconda colonna.

    allora scrivo il codice nell'evento SortCompare, così quando si va a odinare la seconda colonna, riodina tutto secondo i valori contenuti nella prima colonna:
    codice:
    Select Case e.Column.Name
        Case "Column2"
            Dim Val1 As Integer = CType(.Rows(e.RowIndex1).Cells("Column1").Value, Integer)
            Dim Val2 As Integer = CType(.Rows(e.RowIndex2).Cells("Column1").Value, Integer)
            
            e.SortResult = Val1 - Val2
    
            'scrivo l'esito della comparazione nella finestra di debug
            Debug.WriteLine(Val1 & vbTab & Val2 & vbTab & "e.SortResult= " & e.SortResult)
        End Select
    bhe non cambia nullaaaaaaa, esattamente come se il codice immesso non serve a nulla.... se vado per ordinare la seconda colonna e la ordina sempre secondo valori della seconda colonna!!!!!!!!!!!!
    eppure dal debug (attraverso la riga di codice che ho inserito per prova) l'evento viene eseguito, addirittutta e.SortResult assume i giusti valori a ogni comparazione..

    questo trovo scritto nella finestra di debug:
    codice:
    9	8	e.SortResult= 1
    9	1	e.SortResult= 8
    8	1	e.SortResult= 7
    7	8	e.SortResult= -1
    3	8	e.SortResult= -5
    4	8	e.SortResult= -4
    8	5	e.SortResult= 3
    8	6	e.SortResult= 2
    8	2	e.SortResult= 6
    9	7	e.SortResult= 2
    9	4	e.SortResult= 5
    7	4	e.SortResult= 3
    7	3	e.SortResult= 4
    3	4	e.SortResult= -1
    2	6	e.SortResult= -4
    2	1	e.SortResult= 1
    6	1	e.SortResult= 5
    6	5	e.SortResult= 1
    5	1	e.SortResult= 4
    Michele

  4. #4
    per il momento sono riuscito a bypassare il problema eliminando l'evento sortcompare e utilizzando l'evento Sorted con dentro un codice che mi ordina direttamente il mio database e lo butta dentro datagridview.... tenendo conto per quale colonna in datagrid è stato avviato il riordino e se crescente o decrescente (ho approndito bene questa cosa)...
    Lo so che è un metodo ortodosso, ma che ci potevo fare !!
    Michele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.