sql >> Database teknologi >  >> RDS >> Access

ListView Kontrol Træk slip hændelser Håndtering

Introduktion.

Vi er bekendt med træk og slip-operationerne på TreeView Control, i Ms-Access, der omarrangerer noder. Alle basisposterne for Treeview-kontrolknuderne kommer fra en enkelt adgangstabel. Vi opdaterer altid kildenodens forældre-id feltværdi med målnodens ID-værdi på den samme tabelpost for at foretage ændringen af ​​position på TreeView-kontrollen. Posterne flyttes ikke fysisk nogen steder.

Her, med tilføjelsen af ​​ListView Control sammen med TreeView Control, planlægger vi at arbejde med to forskellige adgangstabeller.

  1. lvCategory – Kategorikode og beskrivelse.
  2. lvProducts – Categorywise Products.

På denne måde er det lettere at forstå sammenhængen mellem de to tabeller. Hvilke ændringer skal vi foretage og hvor, når et produktelement (ListView-element) flyttes fra den ene kategori til den anden på TreeView-kontrollen.

lvCategory Access Table har 20 poster for TreeView-knuderne og lvProducts Tabellen har 45 til ListView Control. En eller flere poster i tabellen Produkter er direkte relateret til en produktkategori i kategoritabellen. Forholdet mellem dem er blevet opdateret med feltværdien for kategori-id (CID) på produkttabellens forældre-id feltet, så ændringen af ​​produktets kategori afspejles umiddelbart på ListView Control.

Demodatatabellen blev taget fra Microsoft Access Sample Database Northwind.accdb og opdelt i to dele.

Baseret på ParentID Field Value, for lvProduct-poster, kunne vi filtrere og liste alle de relaterede produktelementer i ListView Control, når en Kategori Node bliver valgt på TreeView Control.

Emner, vi har behandlet indtil videre.

Følgende er hovedemnerne om TreeView , Billedliste , ImageCombo, og ListView Kontroller, vi har dækket indtil videre i MS-Access:

  1. Microsoft TreeView Control Tutorial
  2. Oprettelse af adgangsmenu med TreeView-kontrol
  3. Tildeling af billeder til TreeView-kontrol
  4. Tildeling af billeder til TreeView Control-2
  5. TreeView Control Check-Mark Tilføj slet noder
  6. TreeView ImageCombo-rullemenuen
  7. Omarranger TreeView-noder ved at trække og slippe
  8. ListView-kontrol med MS-Access TreeView

ListView Drag-Drop-opgaven.

Hvad angår ListViews træk og slip-operation, er det en simpel øvelse, der sammenligner den samme metode i TreeView-kontrollen alene. Da Drag Drop-handlingen involverer både TreeView- og ListView-kontroller, bruger vi den samme TreeView0_OLEDragDrop()-hændelsesprocedure med en simpel VBA-kode.

Produktelementerne, der er angivet i ListView Control, tilhører det aktuelle kategorielement, der er valgt i TreeView Control.

Brugeren vælger et bestemt produktelement fra ListView-kontrolelementet, hvis han/hun mener, at det hører til et andet kategorielement, så træk og slip det på målkategorielementet på TreeViewC-kontrollen.

Det flyttede ListView-produktelement vil blive tilføjet til listen over varer, der hører til den ændrede kategori. Produktregistreringens ParentID-feltværdi bliver opdateret med målkategoripost-id'et (CID-værdi).

Det er kun en envejshandling, flyt altid ListView-elementet fra én kategori og slip det på en anden kategoriknude på TreeView-kontrollen.

ListView træk-drop-demoen Adgangsformular frmListViewDrag’ s prøvekørsel Skærmbilledet er vist nedenfor:

På ovenstående billede, Drikkevarer Kategori på TreeView er blevet valgt. Produkterne tilhører kategorien Drikkevarer er blevet opført i ListView Control.

Designvisningen af ​​ovenstående formular:

Listen over kontrolnavne på formularen er som angivet nedenfor:

  1. TreeView-kontrol:TreeView0
  2. ListView Control:ListView0
  3. ImageList Control:ImageList3
  4. Kommandoknap:cmdClose

VBA-koden på frmListViewDrag 's klassemodul:

Option Compare Database
Option Explicit

Dim tv As MSComctlLib.TreeView
Dim lvList As MSComctlLib.ListView
Dim imgList As MSComctlLib.ImageList
Const Prfx As String = "X"

Private Sub Form_Load()
Dim db As DAO.Database
Dim tbldef As TableDef

    Set tv = Me.TreeView0.Object
    tv.Nodes.Clear
    
    Set imgList = Me.ImageList3.Object
    
With tv
    .Font.Size = 9
    .Font.Name = "Verdana"
    .ImageList = imgList 'assign preloaded imagelist control
 End With
    
    Set lvList = Me.ListView0.Object
    lvList.ColumnHeaders.Clear
    lvList.ListItems.Clear
    lvList.Icons = imgList
    
    Set db = CurrentDb
    Set tbldef = db.TableDefs("lvProducts")
    
    'Initialize ListView & Column Headers Property Values
     With lvList
        .ColumnHeaderIcons = imgList
        .Font.Size = 9
        .Font.Name = "Verdana"
        .Font.Bold = False
        
        'ColumnHeaders.Add() Syntax:
        'lvList.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
        'Alignment: 0 - Left, 1 - Right, 2 - Center
        .ColumnHeaders.Add 1, , tbldef.Fields(1).Name, 2600, 0, 5
        .ColumnHeaders.Add 2, , tbldef.Fields(3).Name, 2600, 0, 5
        .ColumnHeaders.Add 3, , tbldef.Fields(4).Name, 1440, 1, 5
    End With
    
    Set db = Nothing
    Set tbldef = Nothing

    
   LoadTreeView 'Create TreeView Nodes

End Sub

Private Sub LoadTreeView()
    Dim Nod As MSComctlLib.Node
    Dim firstCatID As Long
    Dim strCategory As String
    Dim strCatKey As String
    Dim strBelongsTo As String
    Dim strSQL As String
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    
    'Initialize treeview nodes
     tv.Nodes.Clear
     
    'Initialize Listview nodes
    While lvList.ListItems.Count > 0
          lvList.ListItems.Remove (1)
    Wend
    
    strSQL = "SELECT lvCategory.CID, lvCategory.Category, "
    strSQL = strSQL & "lvcategory.BelongsTo FROM lvCategory ORDER BY lvCategory.CID;"
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    If Not rst.BOF And Not rst.EOF Then
        rst.MoveFirst
        firstCatID = rst!CID
    Else
        Exit Sub
    End If
    ' Populate all Records as Rootlevel Nodes
    Do While Not rst.BOF And Not rst.EOF
            strCatKey = Prfx & CStr(rst!CID)
            strCategory = rst!Category
            
            Set Nod = tv.Nodes.Add(, , strCatKey, strCategory, 1, 2)
            Nod.Tag = rst!CID
        rst.MoveNext
    Loop
    
    'In the second pass of the the same set of records
    'Move Child Nodes under their Parent Nodes
    rst.MoveFirst
    Do While Not rst.BOF And Not rst.EOF
        strBelongsTo = Nz(rst!BelongsTo, "")
        If Len(strBelongsTo) > 0 Then
            strCatKey = Prfx & CStr(rst!CID)
            strBelongsTo = Prfx & strBelongsTo
            strCategory = rst!Category
            
            Set tv.Nodes.Item(strCatKey).Parent = tv.Nodes.Item(strBelongsTo)
        End If
        rst.MoveNext
    Loop
    rst.Close
    
    ' Populate ListView Control with Product details
    ' of the first Category Item
    LoadListView firstCatID
    
End Sub


Private Sub LoadListView(ByVal CatID)
    Dim strProduct As String
    Dim strPKey As String
    Dim intcount As Integer
    Dim tmpLItem As MSComctlLib.ListItem
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
    
    ' Initialize ListView Control
    While lvList.ListItems.Count > 0
        lvList.ListItems.Remove (1)
    Wend
   
     strSQL = "SELECT lvProducts.* FROM lvProducts "
     strSQL = strSQL & "WHERE (lvProducts.ParentID = " & CatID & ") "
     strSQL = strSQL & "ORDER BY lvProducts.[Product Name];"
    
    'Open filtered Products List for selected category
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    Do While Not rst.BOF And Not rst.EOF
        intcount = intcount + 1
        strProduct = rst![Product Name]
        strPKey = Prfx & CStr(rst!PID)
        
        'List Item Add() Syntax:
        'lvList.ListItems.Add Index,Key,Text,Icon,SmallIcon
        Set tmpLItem = lvList.ListItems.Add(, strPKey, strProduct, , 3) 'first column
            lvList.ForeColor = vbBlue
            
            'List second column sub-item Syntax:
            'tmpLItem.ListSubItems.Add Column - Index, Key, Text, ReportIcon, ToolTipText
            tmpLItem.ListSubItems.Add 1, strPKey & CStr(intcount), Nz(rst![Quantity Per Unit], ""), 6
            
            'List third column sub-item
            tmpLItem.ListSubItems.Add 2, strPKey & CStr(intcount + 1), Format(rst![list Price], "0.00"), 6, "In Local Currency."
        rst.MoveNext
    Loop
    
    Set db = Nothing
    Set rst = Nothing
    
    If intcount > 0 Then lvList.ListItems(1).Selected = True
    
End Sub

Private Sub TreeView0_NodeClick(ByVal Node As Object)
Dim Cat_ID As String
Cat_ID = Node.Tag

LoadListView Cat_ID

End Sub

Private Sub TreeView0_OLEStartDrag(Data As Object, AllowedEffects As Long)
    Set tv.SelectedItem = Nothing
End Sub

Private Sub TreeView0_OLEDragOver(Data As Object, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
On Error GoTo TreeView0_OLEDragOver_Err

    Dim nodSelected As MSComctlLib.Node
    Dim nodOver As MSComctlLib.Node
    
    If tv.SelectedItem Is Nothing Then
        'Select a node if one is not selected
        Set nodSelected = tv.HitTest(X, Y)
        If Not nodSelected Is Nothing Then
            nodSelected.Selected = True
        End If
    Else
        If tv.HitTest(X, Y) Is Nothing Then
        'do nothing
        Else
            'Highlight the node the mouse is over
            Set nodOver = tv.HitTest(X, Y)
            Set tv.DropHighlight = nodOver
        End If
    End If
    
TreeView0_OLEDragOver_Exit:
Exit Sub

TreeView0_OLEDragOver_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragOver()"
Resume TreeView0_OLEDragOver_Exit
End Sub


Private Sub TreeView0_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)

    Dim tv_nodSource As Node
    Dim tv_nodTarget As Node
    
    Dim strtv_ParentKey As String
    Dim strtv_TargetKey As String
    Dim strListItemKey As String
    Dim strSQL As String
    
    Dim vCatID As Long
    Dim lngPID As Long
    
    On Error GoTo TreeView0_OLEDragDrop_Err
    
    'Get the source/destination Nodes
    Set tv_nodSource = tv.SelectedItem
    Set tv_nodTarget = tv.HitTest(X, Y)
    
        If Not tv_nodTarget Is Nothing Then
            strtv_ParentKey = tv_nodSource.Key
            strtv_TargetKey = tv_nodTarget.Key
                
            If strtv_ParentKey = strtv_TargetKey Then Exit Sub

            'Extract ListItem Key
            strListItemKey = lvList.SelectedItem.Key
                
            'extract Category Record CID Value
            'and ListItem Product ID Key
            vCatID = Val(Mid(tv_nodTarget.Key, 2))
            lngPID = Val(Mid(strListItemKey, 2))
    
            'UPDATE lvProducts Table
            strSQL = "UPDATE lvProducts SET ParentID = " & vCatID & _
            " WHERE PID = " & lngPID
             
            CurrentDb.Execute strSQL, dbFailOnError
                
            Set tv.DropHighlight = Nothing
            tv_nodSource.Selected = True
                
            'Rebuild ListView Nodes
            TreeView0_NodeClick tv_nodSource
                
        Else ' Invalid Target location
            MsgBox "The destination is invalid!", vbInformation
        End If
    
TreeView0_OLEDragDrop_Exit:
Exit Sub

TreeView0_OLEDragDrop_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragDrop()"
Resume TreeView0_OLEDragDrop_Exit
End Sub

Private Sub TreeView0_OLECompleteDrag(Effect As Long)
    Set tv.DropHighlight = Nothing
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

De velkendte VBA-kodesegmenter.

I Form_Load() Hændelsesprocedure, vi initialiserer TreeVew, ListView, ImageList Controls. Det opretter Kolonneoverskrifterne af ListView Control, før du udfylder listeelementer i Listview-kontrollen. I slutningen af ​​denne rutine kalder vi LoadTreeView()-underrutinen.

LoadTreeView() underrutinen udfylder produkternes kategoriknuder på TreeView-kontrollen med registreringerne fra lvCategory Bord. Indlæsning af noder på TreeView Control er en to-trins proces. Hvorfor er det sådan, i stedet for at gøre det på én gang? Dette aspekt er blevet forklaret i detaljer på en tidligere side, det 7. link på listen over links giv ovenfor, hvis du gerne vil gennemgå det. Det er måske ikke passende at gentage dem alle her.

I slutningen af ​​ovenstående underrutine, LoadListView() subrutine er blevet kaldt med den første kategoriposts CID-værdi 1 som parameter.

Værdien 1 i feltet Produktposter med forældre-id er blevet filtreret og opført på ListView Control. Denne procedure blev forklaret i detaljer i sidste uges indlæg, det 8. punkt, blandt listen over links givet ovenfor.

Træk-slip-handlingsunderrutinerne.

Følgende underrutiner, der er knyttet til træk og slip-handlingen, udføres automatisk i den rækkefølge, de præsenteres nedenfor:

  1. TreeView0_OLEStartDrag()
  2. TreeView0_OLEDragOver()
  3. TreeView0_OLEDragDrop()
  4. TreeView0_OLEcompleteDrag()

Den første og sidste underrutine initialiserer de involverede noder og nulstiller deres status til sidst.

Den anden, OLEDragOver()-underrutinen fungerer som MouseMove Event Procedure og sporer musens bevægelse under træk-slip-operationen. Den fremhæver NodeText, når musen er over en Node og sporer dens bane, indtil venstre museknap slippes.

TreeView0_OLEDragDrop()-procedurekoden alene er angivet nedenfor.

Private Sub TreeView0_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)

    Dim tv_nodSource As Node
    Dim tv_nodTarget As Node
    
    Dim strtv_ParentKey As String
    Dim strtv_TargetKey As String
    Dim strListItemKey As String
    Dim strSQL As String
    
    Dim vCatID As Long
    Dim lngPID As Long
    
    On Error GoTo TreeView0_OLEDragDrop_Err
    
    'Get the source/destination Nodes
    Set tv_nodSource = tv.SelectedItem
    Set tv_nodTarget = tv.HitTest(X, Y)
    
        If Not tv_nodTarget Is Nothing Then
            strtv_ParentKey = tv_nodSource.Key
            strtv_TargetKey = tv_nodTarget.Key
                
            If strtv_ParentKey = strtv_TargetKey Then Exit Sub

            'Extract ListItem Key
            strListItemKey = lvList.SelectedItem.Key
                
            'extract Category Record CID Value
            'and ListItem Product ID Key
            vCatID = Val(Mid(tv_nodTarget.Key, 2))
            lngPID = Val(Mid(strListItemKey, 2))
    
            'UPDATE lvProducts Table
            strSQL = "UPDATE lvProducts SET ParentID = " & vCatID & _
            " WHERE PID = " & lngPID
             
            CurrentDb.Execute strSQL, dbFailOnError
                
            Set tv.DropHighlight = Nothing
            tv_nodSource.Selected = True
                
            'Rebuild ListView Nodes
            TreeView0_NodeClick tv_nodSource
                
        Else ' Invalid Target location
            MsgBox "The destination is invalid!", vbInformation
        End If
    
TreeView0_OLEDragDrop_Exit:
Exit Sub

TreeView0_OLEDragDrop_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragDrop()"
Resume TreeView0_OLEDragDrop_Exit
End Sub

Træk-slip-handlingen trin for trin.

TreeView0_OLEDragDrop()-proceduren udføres umiddelbart efter, at venstre museknap er blevet sluppet for at fuldføre Drop-handlingen. I begyndelsen af ​​koden er den aktive og Target TreeView Nodes referencer blevet gemt i tv_nodSource og tv_nodTarget objekt Variabler hhv.

Dernæst udfører vi en kontrol, om ListItem er blevet droppet på en gyldig TreeView Node eller ej. Hvis det slippes på den samme kildekategoriknude eller på et tomt område på TreeView-kontrollen, er disse træk ikke gyldige. Hvis det er blevet tabt i et tomt område af TreeView Control, så tv_nodTarget objektvariablen vil indeholde værdien Intet. I så fald er det viser en meddelelse og afslutter programmet.

Dernæst gemmes TreeView-kilde- og målknudenøgleværdierne i to strengvariabler. Hvis begge nøgler er de samme, trækkes og slippes ListItem på sin egen overordnede node (kategorinode) på TreeView-kontrolelementet. Programudførelsen afbrydes for at fortsætte.

Hvis begge nøgler er forskellige, er det tid til at opdatere ændringen på produktpostens forældre-id felt, med Target Category Records CID Kode, og opdater ListView-elementerne.

Det valgte listeelements nøgleværdi (PID feltværdi) er blevet gemt i strListItemKey Strengvariabel.

Kategoripostens faktiske CID feltværdien er blevet udtrukket fra målknuden ved at fjerne præfiksettegnværdien X og gemt i variabel vCatID . Dette er den værdi, vi opdaterer på produktpostens forældre-ID-felt, for at placere ListItem under den nye kategori.

På samme måde blev det valgte listeelements produkts nøgle-PID-værdi udtrukket og gemt i variabel lngPID . Dette er blevet brugt som kriterium til at filtrere og vælge den pågældende produktpost til opdatering af forældre-ID-feltet med vCatID .

En OPDATERING SQL-forespørgsel er blevet oprettet for at filtrere posten ved hjælp af lngPID Kode som kriterier, for at filtrere produktregistreringen og for at opdatere vCatID Værdi i P arentID felt.

Udfør metoden for Currentdb er blevet kaldt med SQL'en og opdaterer ændringen.

Fremhævningen af ​​noden er blevet nulstillet til kildenoden.

Dernæst er TreeView0_NodeClick()-underrutinen blevet kaldt med tv_nodSource som en parameter for at afspejle ændringen på ListView Control.

Luk Klik på knappen for at lukke formularen.

Download demodatabase.

Du kan downloade demodatabasen, lave prøvekørsler og studere VBA-koden.


ØNSKER DIG ET RIGTIG GODT NYTÅR.

MS-ACCESS BEGIVENHEDSHÅNDTERING

  1. Med Events MS-Access Class Module
  2. Med begivenheder og definer dine egne begivenheder
  3. Tekstboksfane med begivenheder Combo List
  4. Få adgang til formularkontrolarrays og hændelse
  5. Få adgang til Form Control Arrays And Event-2
  6. Få adgang til Form Control Arrays And Event-3
  7. Medhændelser i klassemodul for underform
  8. Medhændelser i klassemodul og data
  9. Med hændelser og adgangsrapporthændelsessink
  10. Medhændelser og rapportlinjeskjul
  11. Medhændelser og rapportlinjefremhævning
  12. Med Events Texbox og kommandoknap
  13. Kommandoknap i tekstboks med begivenheder
  14. Medhændelser og alle formularkontroltyper



  1. Mysql-databasesynkronisering mellem to databaser

  2. ORA-65139:Uoverensstemmelse mellem XML-metadatafil og datafil

  3. Sådan udskrives flere rapporter med stregkoder \ eller flere stregkoder i én rapport

  4. Opret en skemabundet UDF i SQL Server