sql >> Databasteknik >  >> RDS >> Access

ListView Kontroll Dra-släpp Sortera händelser

Omordna rader med data i ListView Control.

I det tidigare avsnittet av den här handledningen har vi lärt oss hur man ordnar om kolumnerna genom att aktivera den här funktionen:AllowColumnReorder alternativet på egenskapsbladet. Men att flytta en rad görs genom att dra och placera den på en annan rad. För att omorganisera ListView-kontrollraderna kräver åtgärden ListItem Dra och släpp att den här funktionen aktiveras på egenskapsbladet. Men detta fungerar inte ensamt, behöver VBA-kod för att ordna om objektet till dess önskade ordning.

Låt oss skapa ett exempel på åtkomstformulär med kontroller och VBA-kod i vår databas för denna övning. Exempelbilden av formuläret med ListBox och ListView-kontroller ges nedan.

Vi har skapat en lista med tabeller och frågor (inte åtgärdsfrågor) i listrutan. Om du väljer ett av listobjekten visas posterna direkt på ListView-kontrollen, som vi ser dem i databladsvyn.

Designuppgiften.

  1. Skapa en ny tabell med ett enda textfält, med fältnamnet DataList .

  2. Spara tabellen med namnet lvTables (lv står för ListView).

  3. Öppna tabellen i databladsvyn.

  4. Lägg till några tabellnamn och välj frågenamn från din databas i tabellen. Jag har importerat tabeller från Northwind-exempeldatabasen för min lista.

    Obs! Bilagan Fältet är inte giltigt i ListView Control. Skapa urvalsfrågor för tabeller med bifogade fält och välj alla fält utom fält för bilaga.

  5. Skapa och öppna ett nytt formulär i designvyn.

  6. Infoga en ListBox-kontroll i formuläret, visa egenskapsbladet och ändra dess namn egenskapsvärde till List0 .

  7. Ändra dess underordnade etikett Caption värde till Tabell .

  8. Visa egenskapsbladet för ListBox-kontrollen och ställ in Radkälla egenskapsvärde till lvTables namn.

  9. Kontrollera om radkälltypen är inställd som tabell/fråga och om egenskapsvärdet för bunden kolumn är 1. Ändra om det är annorlunda.

  10. Infoga en ListView-kontroll från ActiveX-kontrolllistan och ändra dess namnegenskapsvärde till ListView1 .

  11. Ändra storlek på båda kontrollerna som visas på demoformulärbilden ovan.

  12. Infoga en etikett ovanför kontrollerna och ändra dess egenskapsvärden för namn och bildtext till Rubrik. Caption-värdet kommer att ändras från vba-koden när en tabell eller fråga väljs från listrutan.

  13. Skapa en kommandoknapp under kontrollerna och ändra dess Name-egenskapsvärde till cmdClose och egenskapsvärdet Caption för att Stäng .

  14. Högerklicka på ListView-kontrollen, markera ListViewCtrl-objektet och välj Egenskaper .

  15. Ändra egenskapsinställningarna så att de matchar inställningarna i Allmänt Flikbild nedan.

  16. ListView Control Property Sheet bild - Allmän flikvy ges nedan:

    Några av dessa alternativ har vi redan ställt in i de tidigare sessionerna. Här behöver vi följande alternativ för vår Drag Drop-åtgärd:

    • OLEDragAutomatic - 1

    • OLEDropManual - 1

    • FullRowSelect - Sant

    • HotTracking - Sant

Se till att inställningarna ovan stämmer överens med ditt egenskapsblad och spara sedan formuläret.

Visa formulärets VBA-modul.

Formmodulens VBA-kod.

Kopiera och klistra in följande VBA-kod i modulen, skriv över befintliga kodrader, om några:

Option Compare Database
Option Explicit

Dim lvwList As MSComctlLib.ListView
Dim strTable As String
Dim db As DAO.Database
Dim rst As DAO.Recordset

Private Sub Form_Load()
    Set lvwList = Me.ListView1.Object

End Sub


Private Sub Form_Unload(Cancel As Integer)
On Error GoTo Form_Unload_Err
Dim lvItem As ListItem
Dim tmp As Long
Dim criteria As String
Dim strfield As String
Dim flag As Boolean
Dim fld As String

If strTable = "" Then
Set lvwList = Nothing
    Exit Sub
End If

Set db = CurrentDb
Set rst = db.OpenRecordset(strTable, dbOpenDynaset)
flag = False
For Each lvItem In lvwList.ListItems
    tmp = lvItem.Index
    strfield = lvwList.ColumnHeaders(1).Text
    criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34)
    
    rst.FindFirst criteria
  
    If Not rst.NoMatch Then
       If (rst.Fields(strfield).Value = lvItem.Text) _
       And (rst.Fields(1).Value = tmp) Then
         'GoTo nextitem
       Else
            rst.Edit
            rst.Fields(1).Value = tmp
            rst.Update
       End If
    Else
        MsgBox "Item: " & tmp & " Not Found!"
    End If
Next
rst.Close

Set lvwList = Nothing
Set lvItem = Nothing
Set rst = Nothing
Set db = Nothing

Form_Unload_Exit:
Exit Sub

Form_Unload_Err:
MsgBox Err & " : " & Err.Description, , "Form_Unload()"
Resume Form_Unload_Exit

End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object)
' When a ColumnHeader object is clicked, the ListView control
' sorts the data of that column. On the first Click on the Column
'will sort in Ascending Order, second Click will sort in Descending
With Me.ListView1
    ' Set the SortKey to the Index of the ColumnHeader - 1
    .SortKey = ColumnHeader.Index - 1
    
' Set Sorted to True to sort the list.
 If .SortOrder = lvwAscending Then
    .SortOrder = lvwDescending
 Else
    .SortOrder = lvwAscending
 End If
 
    .Sorted = True
End With

End Sub

Private Sub List0_Click()

strTable = List0.Value

Call LoadListView(strTable)

End Sub

Private Sub LoadListView(ByVal s_Datasource As String)
On Error GoTo LoadListView_Err
    Dim j As Integer
    Dim tmpLItem As MSComctlLib.ListItem
    Dim strHeading As String
    
    strHeading = UCase(s_Datasource)
    With Me.Heading
        .caption = strHeading
        .FontName = "Courier New"
        .FontSize = 20
        .FontItalic = True
        .FontBold = True
    End With
    
   'Initialize ListView Control
    lvwList.ColumnHeaders.Clear
    lvwList.ListItems.Clear
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset(s_Datasource, dbOpenSnapshot)
       
    'Initialize ListView & Column Headers Property Values
     With lvwList
        .Font.Size = 10
        .Font.Name = "Verdana"
        .Font.Bold = False
        .GridLines = True
    End With
    
    With lvwList
        'Syntax: .ColumnHeaders.Add Index, Key, Text, Width in Pixels, Alignment, Icon
       For j = 0 To rst.Fields.Count - 1
        .ColumnHeaders.Add , , rst.Fields(j).Name, IIf(j = 0, 3000, 1400), 0
       Next
    End With
   Dim I As Long
    rst.MoveFirst
    Do While Not rst.BOF And Not rst.EOF
    'Syntax: lvwList.ListItems.Add Index, Key, Text, Icon, SmallIcon
        Set tmpLItem = lvwList.ListItems.Add(, , rst.Fields(0).Value) 'Name column
        
         'Syntax: tmpLItem.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText
          With tmpLItem
                For j = 1 To rst.Fields.Count - 1
                    .ListSubItems.Add , , Nz(rst.Fields(j).Value, "")
                Next
          End With
        rst.MoveNext
    Loop
    rst.Close
    
    With lvwList
        If .ListItems.Count > 0 Then
            .ListItems(1).Selected = True
        End If
    End With
  
    Set db = Nothing
    Set rst = Nothing
    
LoadListView_Exit:
Exit Sub

LoadListView_Err:
MsgBox Err & " : " & Err.Description, , "LoadListView()"
Resume LoadListView_Exit
End Sub


Private Sub ListView1_OLEDragOver(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
    'Highlight the item when draged over it
    Set ListView1.DropHighlight = ListView1.HitTest(x, y)

End Sub

Private Sub ListView1_OLEDragDrop(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

'Item being dropped
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Item being readded to the list
Dim lvwTarget As ListItem
'Subitem reference in dropped item
Dim lvwSub As ListSubItem
'Drop position
Dim intTgtIndex As Integer
Dim j As Integer

Set lvwDrop = lvwList.HitTest(x, y)
Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item

'Ignore overlapping drag or drop Item actions
If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then
    Set lvwList.DropHighlight = Nothing
    Set lvwDrop = Nothing
    Set lvwDrag = Nothing
    Exit Sub
End If

'Save the droped position Index Number
intTgtIndex = lvwDrop.Index
'Remove Dragged Item from its old position
lvwList.ListItems.Remove lvwDrag.Index

'For j = intTgtIndex To ListItems.Count
    
'Creates a new Item in the Target Item position
'with the Dropped Item Index Number and Dragged Item.Text.
'Saves the new Item reference in lvwTarget Item.

'* The original Droped-on Target) Item will be moved down
'* by incrementing its original Index Number
Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text)

'Copy the original Draged Item's subitems to the new item
If lvwDrag.ListSubItems.Count > 0 Then
    For Each lvwSub In lvwDrag.ListSubItems
        lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text
    Next
End If

'Highlight the draged item in its new position
lvwTarget.Selected = True

'Destroy all objects
Set lvwTarget = Nothing
Set lvwDrag = Nothing
Set lvwDrop = Nothing
Set lvwList.DropHighlight = Nothing

End Sub

Private Sub cmdClose_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Du är bekant med ovanstående VBA-kod förutom de nyligen tillagda subrutinerna:ListView1_OLEDragOver(), ListView1_OLEDragDrop(), Form_Unload(), och ListView1_ColumnClik() förfaranden. De två första procedurerna hjälper oss att dra ett objekt (rad) och släppa det över ett annat objekt för att infoga det på en ny plats. Procedurerna Form_Unload() och ListView1_ColumnClick() kommer att sortera objekten.

Följande bilder visar Dra och släpp-åtgärden i sekvenser av dess exekvering

Den första bilden nedan visar sekvensen för dra och släpp. ListItem, med EmployeeID 7, dras upp av användaren och faller över ListItem med ID 3.

Den andra bilden visar flyttningen av ListItem i omvänd ordning.

När muspekaren rör sig över en rad med det släpade objektet, mellan käll- och målraden, markeras den ena efter den andra på vägen upp.

Dra och släpp-åtgärden i bilder.

Raden med Employee ID 7 tas bort på objektet med Employee ID 3 ovan.

VBA-koden segmentvis analys.

Ett objektval från ListBox, List0_Click()-händelseproceduren körs och läser in posterna i ListView-kontrollen.

Private Sub List0_Click()
Dim strTable As String

strTable = List0.Value

  Call LoadListView(strTable)

End Sub

Det valda tabell-/fråganamnet sparas i strTable strängvariabel. LoadListView() subrutinen körs med variabeln strTable som parameter. Vi har gått igenom denna kod mer än en gång under tidigare sessioner, och du kan besöka dessa sidor med hjälp av länkarna som finns längst ner på den här sidan för detaljer. Du kan hitta några mindre ändringar som jag har gjort i den här koden.

Vi har inte använt ImageList Control i det här avsnittet Icon, SmallIcon Parametervärden i ListItems.Add()-metoden och ReportIcon, TooltipText parametervärden i metoden ListSubItems.Add() används inte heller.

Låt oss titta på vad som händer i ListView1_OLEDragOver() och ListView1_OLEDragDrop() VBA-kodsegment.

ListView1_OLEDragOver()-proceduren.

Private Sub ListView1_OLEDragOver(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
    'Highlight the item when draged over it
    Set ListView1.DropHighlight = ListView1.HitTest(x, y)
End Sub 

Denna procedur körs automatiskt när du försöker klicka och hålla på en rad, börjar dra och flytta över andra rader på väg mot målraden. Draåtgärden flyttas över en annan rad, den kommer att markeras.

ListView1.HitTest(x, y) funktionen läser x, y-koordinaterna som bestämmer radens position på ListView-kontrollen och markerar den raden. Denna process fortsätter när du är över andra rader tills du släpper den på målraden genom att släppa musknappen. Släppåtgärden utlöser ListView1_OLEDragDrop() proceduren och exekverar källradens ändringsprocedurer.

ListView1_OLEDragDrop-proceduren.

Private Sub ListView1_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

'Item being dragged
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Item being added to the list
Dim lvwTarget As ListItem
'Subitem reference used in For . . .Next loop
Dim lvwSub As ListSubItem 'Drop position index Dim intTgtIndex As Integer Set lvwDrop = lvwList.HitTest(x, y) 'save the source item Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item 'Ignore overlapping drag or drop Item actions If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then Set lvwList.DropHighlight = Nothing Set lvwDrop = Nothing Set lvwDrag = Nothing Exit Sub End If 'Save the droped position Index Number intTgtIndex = lvwDrop.Index 'Remove Dragged Item from its old position lvwList.ListItems.Remove lvwDrag.Index 'Creates a new Item in the Target Item position 'with the Dropped Item Index Number and Dragged Item.Text. 'Saves the new Item reference in lvwTarget Item. '* The original Droped-on Target) Item will be moved down '* by incrementing its original Index Number Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) 'Copy the original Draged Item's subitems to the new item If lvwDrag.ListSubItems.Count > 0 Then For Each lvwSub In lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text Next End If 'Highlight the draged item in its new position lvwTarget.Selected = True 'Destroy all objects Set lvwTarget = Nothing Set lvwDrag = Nothing Set lvwDrop = Nothing Set lvwList.DropHighlight = Nothing End Sub

Låt oss granska denna procedur del för del och förstå vad som händer där. Följande kodsegment förklarar nödvändiga objektvariabler för att hantera Dra och släpp-åtgärden:

'Item being dragged
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Reference of the Item being added to the list
Dim lvwTarget As ListItem
'Subitem reference used in For . . .Next loop
Dim lvwSub As ListSubItem
'Drop position index
Dim intTgtIndex As Integer

Set lvwDrop = lvwList.HitTest(x, y)
Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item

De tre första ListItem temporära objekten deklareras med olika namn.

lvwDrag ListItem-objektet kommer att hålla kopian av raden vi väljer att dra till en ny plats.

lvwDrop ListItem Object kommer att spara referensen till raden där vi släpper det släpade listobjektet.

Under övergången av ListItems-åtgärden kommer vi att ta bort Source-objektet från dess ursprungliga plats och sedan skapa det på målplatsen, med källans ListItem Index-nummer. Referenserna för denna nya ListItem sparas i lvwTarget ListItem objektvariabel.

lvwSub Variabel deklarerad som en sekvensobjektvariabel i For . . .Nästa Slinga. Denna looping kräver att man sekvenserar genom ListSubItems, (andra kolumnen och framåt) en efter en, från lvwDrag-objektet. Även om vi har tagit bort det ursprungliga ListItem har vi sparat en kopia av det i objektet lvwDrag ListItem.

lvwDrop ListItem Index-numret sparas i intTgtIndex Variabel.

lvwList.HitTest(x, y) Funktionen läser x, y koordinaterna för ListView Control och identifierar mål ListItem där vi har släppt källlistan ListItem och gör en kopia av den i lvwDrop Object.

Vi väljer först ett listobjekt innan vi drar det till den nya positionen.

lvwList.SelectedItem Egenskapen ställs in som True. Med hjälp av denna egenskapsstatus gör vi en kopia av den valda ListItem till lvwDrag ListItem Object. Nästa kodsegment validerar både käll- och mållistobjekt.

Verifieringskontroller av Drag-Drop-åtgärden.

'Ignore overlapping drag or drop Item actions, 
'OR drag and drop happens on the same ListItem.
If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing)  Or (lvwDrop = lvwDrag) Then
    Set lvwList.DropHighlight = Nothing
    Set lvwDrop = Nothing
    Set lvwDrag = Nothing
    Exit Sub
End If

Ovanstående kodsegment validerar drag och släpp-åtgärden. Om dessa åtgärder inte startade eller slutade på ett giltigt objekt kommer lvwDrop- eller lvwDrag-objekten eller båda att vara tomma. Eller ett annat ogiltigt drag kan hända när användaren flyttar en rad upp eller ner men kan ändra sig och släppa tillbaka den på samma rad. Upptäckt av dessa typer av felaktiga drag kommer att avsluta programmet.

Om testet ovan visar sig giltigt kommer programmet att fortsätta att utföra nästa procedur för att ordna om raderna.

'Save the dropped position ListItem Index Number
intTgtIndex = lvwDrop.Index

'Remove Dragged Item from its old position
lvwList.ListItems.Remove lvwDrag.Index

'Creates a new Item in the Target Item position
'with the Dropped Item Index Number and Dragged Item.Text.
'Saves the new Item reference in lvwTarget Item.

'* The original Droped-on Target) Item will be moved down
'* by incrementing its original Index Number
Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text)

'Copy the original Draged Item's subitems to the new item
If lvwDrag.ListSubItems.Count > 0 Then
    For Each lvwSub In lvwDrag.ListSubItems
        lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text
    Next
End If

'Highlight the draged item in its new position
lvwTarget.Selected = True

Ovanstående nio rader med körbar kod (andra rader är kommentarer) är något enkla.

intTgtIndex =lvwDrop.Index -satsen sparar mållistobjektets indexnummer i intTgtIndex Variabel.

Eftersom vi redan har sparat Source Row listItem i det temporära Object lvwDrag, är nästa steg att ta bort källlistan ListItem från ListView Control. ListItems.Remove()-proceduren anropas med satsen lvwList.ListItems.Remove lvwDrag.Index .

Kort sagt är Drag Drop-åtgärden att ta bort en listobjekt från dess ursprungliga plats och skapa den igen på målplatsen med målradens indexnummer.

Satsen Set lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) skapar den nya ListItem med dess målplatsindexnummer intTgtIndex och Text värdet för källlistobjektet sparat i lvwDrag-objektet tidigare.

När vi skapade ListItem för första gången har vi endast använt dessa två värden, indexet och Text parametervärden. Vi har inte använt de andra parameteralternativen Key, Icon, och SmallIcon annars måste vi inkludera dessa parametervärden också från lvwDrag-objektet.

Enligt våra Drag Drop-exempelbilder som visas ovan har vi flyttat det 7:e listobjektet och släppt det på det 3:e listobjektet. Efter det har vi tagit bort det 7:e objektet (eller källlistobjektet) från ListView-kontrollen. Skapat en ny ListItem med målindexnummer 3.

Nu finns det två objekt med samma indexnummer 3, den befintliga med indexnummer 3 och den nya vi har skapat med indexnummer 3. All annan information är hämtad från lvwDrag-objektet (eller det 7:e ListItem sparat i lvwDrag Objekt tidigare).

Systemet ökar automatiskt den befintliga ListItem 3 och framåt till nästa sekvensnummer 3,4,5. . . till 4,5,6. . . och flyttar dem framåt för att ge utrymme för det inkommande objektet att infoga mellan.

Konsekvensen av att ta bort en rad och skapa den någon annanstans.

Anta att vi gör det i omvänd ordning, som att dra ListItem nummer 3 ovanifrån och släppa det på objekt nummer 7, vad händer då?

Naturligtvis kommer vi att ta bort den 3:e artikeln och kommer att försöka skapa en ny artikel med indexnummer 7 på den nya platsen. När artikelnummer 3 raderas kommer artikelnummer 4 att flyttas uppåt eller 4,5,6,7,8,9 blir 3,4,5,6,7,8 (för att göra alla objekt i sekvens) eller det tidigare objekt med indexnummer 7 blir 6.

När vi skapar den nya artikeln med indexnummer 7 kommer den befintliga 7,8 att bli 8,9 igen. När vi tittar på rörelsen av rader medan radradering och skapande tid kommer det första exemplet att flytta målraden nedåt för att ge plats för det inkommande objektet. I det andra förklarade exemplet (flyttar 3 till 7) kommer destinationsraden att flyttas uppåt.

Obs! Titta tAnställdas ID-värde för dess placering som en ledtråd för att ListItem flyttas ner eller flyttas upp när vi ordnar om ListItem.

Jag har nämnt ListItem överallt i dra-släpp-operationer. ListItem hänvisar endast till den första kolumnen i ListView-raden. Andra kolumnvärden är ListSubItems eller underordnade objekt för ListItem. Det betyder att du bara kommer att kunna dra och släppa den första kolumnen. Andra kolumner eller ListSubItems kommer att flyttas under ListItem med VBA-kod.

Detta är sant om du inte har aktiverat FullRowSelection på ListView Control Property Sheet på Allmänt Tab.

Om det är aktiverat kan du välja vilken kolumn som helst, men systemet hänvisar till ListItem Index för omordning av rader. Jämför de två ovanstående bilderna med en annan uppsättning av två exempelbilder, den tredje och fjärde bilden från toppen av den här sidan.

Dra och släpp-åtgärden fungerar inte om följande två egenskapsvärden inte är inställda på ListView Control Property Sheet på Allmänt Tab.:

  • ccOLEDragAutomatic =1
  • ccOLEDropManual =1

De nästa fem satserna kommer att flytta ListSubItems, om någon, till ListItem som nyligen skapats på den nya platsen.

Därefter markeras det nyskapade ListItem.

Därefter rensas alla skapade tillfälliga objekt från minnet.

Obs! En annan viktig punkt att notera här är att detta arrangemang är tillfälligt och går förlorat när du stänger formuläret eller laddar en annan tabell/fråga på ListView-kontrollen.

Om vi ​​vill att den ändrade ordningen på ListItems ska förbli permanent, eller tills ordningen ändras nästa gång, måste vi kunna uppdatera det aktuella indexerade ordernumret på själva tabellen. Vi har lagt till ett nytt heltalsfält med fältnamns-ID i tabellen för anställda.

Exempelskärmen med anställdas data omarrangerade i alfabetisk ordning visas nedan:

Eftersom fältet Medarbetar-ID är ett AutoNumber-fält och länkat till andra relaterade tabeller har vi lagt till ett nytt nummerfält med fältnamnet ID. Detta fältvärde sätts initialt med samma sekvensnummer från medarbetar-ID manuellt. Detta fältvärde kommer initialt att vara i denna ordning. Men listView-radernas data kan ändra sin ordning när du ordnar om data på ListView-kontrollen på grund av Dra och släpp-åtgärder.

Titta på AnställdaQ Fråga SQL nedan:

SELECT [FirstName] & " " & [LastName] AS EmployeeName, 
Employees.ID, 
Employees.EmployeeID, 
Employees.TitleOfCourtesy, 
Employees.Title, 
Employees.Address, 
Employees.City, 
Employees.Region, 
Employees.PostalCode, 
Employees.Country, 
Employees.HomePhone, 
Employees.Extension, 
Employees.Notes
FROM Employees
ORDER BY Employees.ID;

Ovanstående fråga används som datakälla för ListView-kontrollen och de sorteras i ID-fältet. ID-fältet uppdateras med den ändrade ordningen av indexnummer på ListView-kontrollen. Uppdateringsprocessen körs från Form_Unload() Händelseprocedur när du stänger formuläret. Den här metoden säkerställer att när du öppnar ListView Control nästa gång kommer data att vara i den ordning du beställde om förra gången.

Form_Unload() Händelseprocedur VBA-kod.

Private Sub Form_Unload(Cancel As Integer)
Dim lvItem As ListItem
Dim tmp As Long
Dim criteria As String
Dim strfield As String
Dim fld As String

If strTable = "" Then
Set lvwList = Nothing
    Exit Sub
End If

Set db = CurrentDb
Set rst = db.OpenRecordset(strTable, dbOpenDynaset)

For Each lvItem In lvwList.ListItems
    tmp = lvItem.Index
    strfield = lvwList.ColumnHeaders(1).Text 'EmployeeName
    criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34)
    
    rst.FindFirst criteria
  
    If Not rst.NoMatch Then
       If (rst.Fields(strfield).Value = lvItem.Text) And (rst.Fields(1).Value = tmp) Then
         'GoTo nextitem
       Else
            rst.Edit
            rst.Fields(1).Value = tmp 'replace ID number
            rst.Update
       End If
    Else
        MsgBox "Item: " & tmp & " Not Found!"
    End If
Next
rst.Close

Set lvwList = Nothing
Set lvItem = Nothing
Set rst = Nothing
Set db = Nothing

End Sub

Kontrollera Anställdsnamn Fältvärde i bilden ovan. De är ordnade i alfabetisk ordning. Det nya ID-fältvärdet i tabellen Anställda kommer att uppdateras med deras nuvarande ListView Control ListItem indexnummersekvens.

Om du noterar följande punkter kan du lätt förstå vad vi gör med ovanstående kod:

  1. ListItems (första kolumnen) Text parametervärde är anställds namn och ordnas i alfabetisk ordning.

  2. ListItems på ListView Control har indexnummer från 1 till 9 i den ordning de visas på skärmen, dvs. den första artikelns indexnummer är 1 och den sista är 9. De ursprungliga uppgifterna i fältet Employees Table ID är inte i denna ordning.

  3. Vi tar Text Värde (Employee Name) för den första ListItem och sök efter namnet i tabellen.

  4. När posten hittas uppdateras (ersätts) den aktuella ListItems indexnummer i ID-fältet i tabellen.

  5. Denna process upprepades för alla återstående poster på bordet.

Låt oss gå igenom VBA-koden. I början kontrollerar vi om källdatatabellen/frågan laddades in i ListView-kontrollen eller inte?

Om strTable Variabeln initieras inte med frågenamnet då ListView-kontrollen är tom. Om så är fallet öppnade användaren formuläret och stängde det utan att välja frågenamnet för att ladda data till ListView-kontrollen. Form_Unload Händelseproceduren avbryts vid denna tidpunkt och stänger formuläret.

Om ListView-kontrollen har data exekveras nästa steg och öppnar källdatafrågan EmployeesQ för att uppdatera.

Nästa steg är att gå igenom varje listobjekt och uppdatera indexnumret i ID-fältet i anställningsposten.

Först sparas det aktuella radindexnumret i tmp Variabel.

Det första lvwList.ColumnHeader-namnet EmployeeName och medarbetarens namn är hämtat från ListItem.Text till ett uttryck i Kriterier strängvariabel, som EmployeeName ="Andrew Fuller".

rst.FindFirst-kriterierna kommandot söker i källdatatabellen för att hitta posten med det angivna namnet. När posten hittas uppdateras det aktuella ListItem Index-numret i ID-fältet.

Denna process upprepas för alla rader på ListView Control och när det är klart stängs formuläret.

Nästa gång du laddar in posterna från denna fråga till ListView Control kommer de att visas i samma ordning när du stängde formuläret förra gången.

Obs:Frågan blev nödvändig här för att sortera data i ID-fältet och visa dem i ändrad ordning på ListView Control.

Allt detta arbete var för att spara data i den senast sorterade ordningen så att nästa gång du öppnar formuläret kommer data på ListView-kontrollen att vara i den ordningen.

Utforskaren liknande sorteringsmetod.

I Utforskaren i Windows kan du sortera den visade listan i stigande eller fallande ordning genom att klicka på valfri kolumnrubrik. Kolumnrubriken fungerar som en växlingsknapp. Upprepade klick på kolumnrubriken kommer att sortera kolumndata i stigande/fallande ordning enligt följande ListView1_ColumnClick() Händelseprocedur:

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object)
' When a ColumnHeader object is clicked, the ListView control is
' sorted by the subitems of that column.

With Me.ListView1
' Set the SortKey to the Index of the ColumnHeader - 1
    .SortKey = ColumnHeader.Index - 1
    
 If .SortOrder = lvwAscending Then
    .SortOrder = lvwDescending
 Else
    .SortOrder = lvwAscending
 End If
 ' Set Sorted to True to sort the list.
     .Sorted = True
End With
End Sub

Obs! Sorteringen av all data är endast i textjämförelseläge. Listobjekt och ListSubItems Lägg till() metodens tredje parameter, den visade informationen på ListView Control är Text typ. Datum och numeriska värden behandlas endast som text.

Utforskaren i Windows sparar den senast sorterade ordningen av objekt i mappen. När vi öppnar den mappen igen kommer listan att visas i tidigare sorterad ordning.

Med Form_Unload() Händelseprocedur den här funktionen i Windows Utforskaren blir möjlig på tabellen för anställda. När du stänger formuläret efter att ha sorterat på valfri kolumn kommer den indexerade ordersekvensen att sparas i tabellen Anställda i ID-fältet. EmployeesQ Query sorterar alltid data i ID-fältet när den öppnas.

Demodatabasen bifogas för nedladdning. Det finns två demoformulär i databasen. Det första formuläret visar öppningen av tabeller och frågor i ListView-kontrollen för att visa data i databladsvy. Det andra formuläret använder endast EmployeesQ Fråga ensam för att dra, släppa, sortera och spara den senaste sorteringsordningen av data för framtida användning.



  1. ActiveX ListView Control Tutorial-01.
  2. ListView Control Tutorial-02.
  3. Tilldela bilder till ListView-objekt.
  4. ListView Control Drag-Drop Sortera händelser
  5. ListView-kontroll med MS-Access TreeView
  6. TreeView/ListView-kontroller Dra-släpp-händelser

  1. Jobbkö som SQL-tabell med flera konsumenter (PostgreSQL)

  2. Sök efter helordsmatchning i MySQL

  3. Oracle felhantering

  4. Lista över nummerformatselement i Oracle