Εδώ σου έχω συνημένο ένα παράδειγμα (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.