Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Bookmarking in Vsflexgrid6 της VideoSoft in VB6

Îåêßíçóå áðü ôï ìÝëïò Papakis. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 04-03-2005, 04:31. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-03-2005, 20:52 1345

    Bookmarking in Vsflexgrid6 της VideoSoft in VB6

    Υπάρχει κάποιος τρόπος να κρατήσουμε το Bookmark στο VSFlexGrid 6
    Ουσιαστικά αυτό που θέλω να κάνω είναι το εξής.
    Σε ένα VSFlex έχω για παραδειγμα όλους τους πελάτες μου. Mε Double Click κάνω edit τα στοιχεία κάποιου (μην πεί κανένας ξύπνιος πάνω στο grid, γιατί αν έχω 3 διευθύνσεις και 7 τηλεφώνα τί μέλλει γενέσθαι?). Αφού κάνω την καταχώρηση στην modal form θα πρέπει να ξαναγυρίσω στην φόρμα με τα συγκεντρωτικά στοιχεία. Σ' αυτό το σημείο θα ήθελα να πώ ότι το grid γίνεται initalize και updated με τα στοιχεία που άλλαξα. Αποτέλεσμα αυτού του γεγονότος είναι το grid να επιλέγει και εμφανίζει την πρώτη γραμμή. Μια λύση που βρήκα είναι να εφαρμόζω τη μέθοδο grid.Select intRow όπου intRow είναι η επιλεχθείσα γραμμη πριν γίνει το Double Click. Αυτό έχει ως αποτέλεσμα 2 μειονεκτήματα
    1) Να μην εμφανίζει στο χρήστη τον επιλεγέντα πελάτη - με αποτέλεσμα να "σκρολλάρει" προς τα κάτω για να βρεί τον πελάτη που έχει γίνει η αλλαγη (παρ' όλα αυτά ο πελάτης έχει επιλεγεί σωστα) και
    2) Αν ο χρήστης εφαρμόσει καποια ταξινόμηση στα περιεχόμενα του grid (Click στη fixed row) τότε χάνεται και η επιλεγείσα γραμμή  
    Υπάρχει κάποια μέθοδος eσωτερική του grid ή κάποιο code example

    Ευχαριστώ
    Papakis

  •  03-03-2005, 23:07 1347 σε απάντηση της 1345

    Re: Bookmarking in Vsflexgrid6 της VideoSoft in VB6

    Υποθέτω ότι το grid είναι είτε databound είτε το ανανεώνεις μετά το edit. Διαφορετικά θα μπορούσες απλά να περάσεις τις τιμές της φόρμας στα κελιά του selection.

    Το grid δεν έχει κάποιο τρόπο να καταλάβει ποιά γραμμή είναι ποιά όταν το ξαναφορτώνεις. Αν το grid καταλάβαινε από primary keys, αυτό ίσως γινόταν, αλλά αυτό δεν συμβαίνει. Εξάλλου, μπορεί το recordset που χρησιμοποιείς να μην περιέχει Primary key. Αυτό που μπορείς να κάνεις είναι να βρεις ποιά πεδία προσδιορίζουν τη γραμμή (primary key, unique πεδίο, συνδιασμός πεδίων κλπ) και να αποθηκεύσεις την τιμή τους πριν γίνει refresh. Μετά το refresh, μπορείς να χρησιμοποιήσεις την FindRow για να βρεις τη γραμμή που αντιστοιχεί στα πεδία-κλειδιά και να την επιλέξεις με το Select. Η έκδοση 8 έχει δύο events, το BeforeDataRefresh και AfterDataRefresh, αλλά δεν ξέρω αν αυτά υπήρχαν στην έκδοση 6.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-03-2005, 04:31 1348 σε απάντηση της 1347

    Re: Bookmarking in Vsflexgrid6 της VideoSoft in VB6

    Συνημμένα: demoVSFlexGrid.zip
    Εδώ σου έχω συνημένο ένα παράδειγμα (demoVSFlexGrid.zip) για να δεις πως μπορείς να περάσεις τα προβλήματα σου. Δεν χρησιμοποιεί το VideoSoft FlexGrid αλλά το MS Hierarchical FlexGrid που η MS έχει κάνει license από την VideoSoft. Λογικά πρέπει να είναι τα ίδια πάνω κάτω και να μην χρειάζεται πολλές αλλαγές...

    Μερικές εξηγήσεις...

    Έχω χρησιμοποιήσει SQL Server και την Northwind Database για να μπορέσεις να δεις το παράδειγμα. Αν δεν έχεις SQL μπορείς να χρησιμοποιήσεις την MS Access αντίστοιχη βάση για να το τρέξεις.

    Το διπλό κλικ επάνω στο Grid...



    Private Sub MSHFlexGrid_DblClick()
    Dim oForm As demoVSFlexGrid.frmForm
        If MSHFlexGrid.MouseRow >= MSHFlexGrid.FixedRows Then
            Set oForm = New demoVSFlexGrid.frmForm
            oForm.FKEmployeeID = CLng(MSHFlexGrid.TextMatrix(MSHFlexGrid.MouseRow, 0))
            Call oForm.Show(vbModal)
            Call Unload(oForm)
            Set oForm = Nothing
            Call oRecordset.Requery
            Call doBindGrid
        Else
            Call doSortGrid
        End If
    End Sub

     
    Αυτό είναι το Double Click πάνω στο Grid. Αν είναι άλλη από την πρώτη γραμμή που έχει τα ονόματα των στηλών, βρήσκει το EmployeeID και το περνάει στην modal φόρμα που θα ανοίξει για να διορθώσει το Record. Όταν επιστρέψει ανανεώνει το recordset για να πάρει τυχόν αλλαγές και το ξαναφορτώνει στο grid.

    Αν είναι η πρώτη γραμμή τότε sortάρει το Grid.

    Πως ταξινομούμε το Grid...



    Private Sub doSortGrid()
    Dim iSortMethod As Integer
    Dim iEmployeeID As Integer
    Dim iCounter As Integer
        If iOldSortColumn <> MSHFlexGrid.MouseCol Then
            iSortMethod = flexSortGenericAscending
        Else
            If iSortMethod = flexSortGenericAscending Then
                iSortMethod = flexSortGenericDescending
            Else
                iSortMethod = flexSortGenericAscending
            End If
        End If
       
        iOldSortColumn = MSHFlexGrid.MouseCol
        With MSHFlexGrid
            .Redraw = False
            iEmployeeID = CLng(MSHFlexGrid.TextMatrix(MSHFlexGrid.Row, 0))
            .Col = iOldSortColumn
            .Sort = iSortMethod
            For iCounter = 1 To MSHFlexGrid.Rows
                If CLng(MSHFlexGrid.TextMatrix(iCounter, 0)) = iEmployeeID Then
                    .Row = iCounter
                    Exit For
                End If
            Next
            If iCounter > MSHFlexGrid.Rows Then
                .Row = 1
            End If
            .Col = 0
            .ColSel = .Cols - 1
            .Redraw = True
        End With
    End Sub

     
    Αυτό που κάνω είναι να μην αφήνω το χρήστη να βλέπει τις αλλάγες που κάνω (Redraw=False) στην συνέχεια βλέπω ποιος είναι ο χρήστης από την κρυφή στήλη με το EmployeeID, ταξινομώ το Grid όπως θέλω και μετά ψάχνω να βρω την γραμμή με το EmployeeID και να την κάνω Highlight. Στο τέλος εμφανίζω το αποτέλεσμα στο χρήστη.

    Πως δένω το Recordset με το Grid...



    Private Sub doBindGrid()
    Dim iEmployeeID As Integer
    Dim iCounter As Integer
       
        If MSHFlexGrid.Row > 0 Then
            If IsNumeric(MSHFlexGrid.TextMatrix(MSHFlexGrid.Row, 0)) Then
                iEmployeeID = CLng(MSHFlexGrid.TextMatrix(MSHFlexGrid.Row, 0))
            End If
        End If
       
        Set MSHFlexGrid.DataSource = oRecordset
        With MSHFlexGrid
            .Redraw = False
            .FormatString = "|Τίτλος|Επίθετο|Όνομα|Θέση"
            .ColWidth(0) = 60
            .ColWidth(1) = 600
            .ColWidth(2) = 1500
            .ColWidth(3) = 1000
            .ColWidth(4) = 2000
            If iEmployeeID > 0 Then
                For iCounter = 1 To MSHFlexGrid.Rows
                    If CLng(MSHFlexGrid.TextMatrix(iCounter, 0)) = iEmployeeID Then
                        .Row = iCounter
                        Exit For
                    End If
                Next
                If iCounter > MSHFlexGrid.Rows Then
                    .Row = 1
                End If
            Else
                .Row = 1
            End If
            .Col = 0
            .ColSel = .Cols - 1
            .Redraw = True
        End With

     
    Αυτό που με ενδιαφέρει εδώ πριν ανανεώσω τα δεδομένα του Grid είναι να βρω, αν υπάρχει επελεγμένος κάποιος εργαζόμενος. Αν υπάρχει αποθηκεύω το EmployeeID για να τον ξαναβρώ. Ανανεώνω τα δεδομένα του Grid στη συνέχεια ξαναφτιάχνω τις ετικέτες στις στήλες και τα πλάτη τους και αν έχω EmployeeID το βρήσκω ή αλλιώς δείχνω την πρώτη γραμμή του Grid.

    Το παράδειγμα είναι λειτουργικό αλλά δεν είναι 100% ελεγμένο για λάθη, ούτε 100% τελιωμένο στην φόρμα που βγαίνει να διορθώσει το Record του εργαζόμενου.

    HTH,
    George J.

    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems