Introduzione.
Abbiamo familiarità con le operazioni di trascinamento della selezione su TreeView Control, in Ms-Access che riorganizza i nodi. Tutti i record di base per i nodi di controllo Treeview provengono da un'unica tabella di accesso. Aggiorniamo sempre il ParentID del nodo sorgente valore del campo, con il Valore ID del Nodo di Destinazione sullo stesso record Tabella, per effettuare il cambio di posizione sul Controllo TreeView. I record non vengono spostati fisicamente da nessuna parte.
Qui, con l'aggiunta di ListView Control insieme a TreeView Control, prevediamo di lavorare con due diverse tabelle di accesso.
- lvCategory – Codice categoria e descrizione.
- lvProducts – Prodotti per categoria.
In questo modo è più facile comprendere la relazione tra le due tabelle. Quali modifiche dobbiamo apportare e dove, quando un elemento del prodotto (elemento ListView) si sposta da una categoria all'altra sul controllo TreeView.
La lvCategory Access Table ha 20 record per i nodi TreeView e lvProducts La tabella ha 45 per il controllo ListView. Uno o più record nella tabella Prodotti sono direttamente correlati a una categoria di prodotti nella Tabella delle categorie. La relazione tra loro è stata aggiornata con il valore del campo ID categoria (CID) nella tabella dei prodotti ParentID campo in modo che il cambio di categoria del prodotto si rifletta immediatamente sul controllo ListView.
La tabella di dati demo è stata presa da Northwind.accdb database di esempio di Microsoft Access e divisa in due parti.
Sulla base del valore del campo ParentID, dei record lvProduct, potremmo filtrare ed elencare tutti gli elementi di prodotto correlati nel controllo ListView, quando un nodo di categoria viene selezionato nel controllo TreeView.
Argomenti che abbiamo trattato finora.
Di seguito sono riportati gli argomenti principali su TreeView , Elenco immagini , ImageCombo e Vista elenco Controlli che abbiamo trattato finora in MS-Access:
- Esercitazione sul controllo di Microsoft TreeView
- Creazione del menu di accesso con il controllo TreeView
- Assegnazione di immagini al controllo TreeView
- Assegnazione di immagini a TreeView Control-2
- Segnale di spunta Controllo TreeView Aggiungi Elimina nodi
- Menu di accesso a discesa TreeView ImageCombo
- Riorganizza i nodi TreeView trascinandoli e rilasciandoli
- Controllo ListView con TreeView di MS-Access
L'attività di trascinamento di ListView.
Per quanto riguarda l'operazione di trascinamento della selezione di ListView, è un semplice esercizio che confronta lo stesso metodo all'interno del solo controllo TreeView. Poiché l'azione Drag Drop coinvolge sia i controlli TreeView che ListView, utilizziamo la stessa procedura evento TreeView0_OLEDragDrop() con un semplice codice VBA.
Gli elementi del Prodotto elencati nel controllo ListView appartengono all'elemento della categoria corrente selezionato nel controllo TreeView.
L'utente seleziona un particolare articolo di prodotto dal controllo ListView, se pensa che appartenga a un articolo di categoria diverso, quindi trascinalo sull'articolo di categoria di destinazione sul controllo TreeViewC.
L'articolo del prodotto ListView spostato verrà aggiunto all'elenco degli articoli che appartengono alla categoria modificata. Il valore del campo ParentID del record del prodotto viene aggiornato con l'ID record della categoria di destinazione (valore CID).
È solo un'azione unidirezionale, spostare sempre l'elemento ListView da una categoria e rilasciarlo su un nodo di categoria diverso sul controllo TreeView.
La demo drag-drop di ListView Modulo di accesso frmListViewDrag' s esecuzione di prova L'immagine dello schermo è riportata di seguito:
Nell'immagine sopra, le Bevande La categoria in TreeView è stata selezionata. I prodotti appartenenti alla categoria Bevande sono stati elencati nel controllo ListView.
La visualizzazione del design del modulo di cui sopra:
L'elenco dei nomi di controllo sul modulo è riportato di seguito:
- Controllo TreeView:TreeView0
- Controllo ListView:ListView0
- Controllo ImageList:ImageList3
- Pulsante di comando:cmdClose
Il codice VBA in frmListViewDrag Modulo di classe:
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
I segmenti di codice VBA familiari.
Nel Carica_modulo() Procedura evento, inizializziamo i controlli TreeVew, ListView, ImageList. Crea le ColumnHeadings del controllo ListView, prima di popolare gli elementi List nel controllo ListView. Alla fine di questa routine, chiamiamo la subroutine LoadTreeView().
LoadTreeView() subroutine popola i nodi di categoria dei prodotti nel controllo TreeView, con i record di lvCategory Tavolo. Il caricamento di nodi sul controllo TreeView è un processo in due fasi. Perché è così, invece di farlo in una volta sola? Questo aspetto è stato spiegato in dettaglio in una Pagina precedente, il 7° link nell'elenco dei collegamenti forniti sopra se desideri esaminarlo. Ripeterli tutti qui potrebbe non essere appropriato.
Alla fine della suddetta subroutine, LoadListView() la subroutine è stata chiamata con il valore CID del primo record di categoria 1 come parametro.
I record del prodotto con il valore del campo ParentID 1 sono stati filtrati ed elencati nel controllo ListView. Questa procedura è stata spiegata in dettaglio nel post della scorsa settimana, l'ottavo elemento, tra l'elenco dei collegamenti sopra riportato.
Le subroutine di trascinamento della selezione.
Le seguenti subroutine associate all'azione Trascina e rilascia verranno eseguite automaticamente nell'ordine in cui sono presentate di seguito:
- TreeView0_OLEStartDrag()
- TreeView0_OLEDragOver()
- TreeView0_OLEDragDrop()
- TreeView0_OLECompleteDrag()
La prima e l'ultima Subroutine inizializzano rispettivamente i Nodi coinvolti e ne ripristinano lo stato alla fine.
La seconda, la subroutine OLEDragOver(), funziona come la procedura dell'evento MouseMove e tiene traccia del movimento del mouse durante l'operazione di trascinamento. Evidenzia il NodeText quando il mouse si trova su un Node e ne traccia la traiettoria fino al rilascio del pulsante sinistro del mouse.
Il solo codice della procedura TreeView0_OLEDragDrop() è elencato di seguito.
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
L'azione di trascinamento della selezione passo dopo passo.
La procedura TreeView0_OLEDragDrop() viene eseguita immediatamente dopo il rilascio del pulsante sinistro del mouse per completare l'azione di rilascio. All'inizio del codice, i riferimenti attivi e Target TreeView Node sono stati salvati in tv_nodSource e tv_nodTarget rispettivamente le variabili oggetto.
Successivamente, eseguiamo un controllo, se ListItem è stato rilasciato su un nodo TreeView valido o meno. Se viene rilasciato sullo stesso nodo di categoria di origine o su un'area vuota del controllo TreeView, questi spostamenti non sono validi. Se è stato rilasciato in un'area vuota del controllo TreeView, allora tv_nodTarget la variabile oggetto conterrà il valore Nothing. In tal caso, è visualizza un messaggio ed esce dal programma.
Successivamente, i valori chiave di TreeView Source e Target Node vengono salvati in due variabili stringa. Se entrambe le chiavi sono uguali, ListItem è stato trascinato e rilasciato sul proprio nodo padre (nodo di categoria) sul controllo TreeView. L'esecuzione del programma viene interrotta per continuare.
Se entrambe le chiavi sono diverse, è il momento di aggiornare la modifica sul ParentID del record del prodotto campo, con il CID del record della categoria target Codice e aggiorna gli elementi ListView.
Il valore della chiave ListItem selezionato (PID valore del campo) è stato salvato in strListItemKey Variabile stringa.
Il CID effettivo del record di categoria il valore del campo è stato estratto dal nodo di destinazione, eliminando il valore del carattere del prefisso X e salvato nella variabile vCatID . Questo è il valore che aggiorneremo nel campo ParentID del Product Record, in modo da inserire ListItem nella nuova categoria.
Allo stesso modo, il valore PID chiave del prodotto dell'elemento in elenco selezionato estratto e salvato nella variabile lngPID . Questo è stato utilizzato come criterio per filtrare e selezionare quel particolare record di prodotto per aggiornare il campo ParentID con vCatID .
Un AGGIORNAMENTO La query SQL è stata creata per filtrare il record, utilizzando il lngPID Codice come criteri, per filtrare il record del prodotto e per aggiornare il vCatID Valore nella P arentID campo.
Il Esegui metodo del Currentdb è stato chiamato con l'SQL e aggiorna la modifica.
L'evidenziazione del nodo è stata reimpostata sul nodo di origine.
Successivamente, la subroutine TreeView0_NodeClick() è stata chiamata con tv_nodSource come parametro per riflettere la modifica sul controllo ListView.
La Chiudi Il clic del pulsante chiuderà il modulo.
Scarica il database demo.
Puoi scaricare il database demo, eseguire prove e studiare il codice VBA.
TI AUGURIAMO UN FELICE ANNO NUOVO.
GESTIONE EVENTI MS-ACCESS
- Modulo Classe Withevents MS-Access
- Coneventi e definizione dei tuoi eventi
- Scheda Casella di testo dell'elenco combinato di eventi
- Accedi agli array e agli eventi di controllo dei moduli
- Accedi agli array di controllo dei moduli e all'evento-2
- Access Form Control Array ed Event-3
- Modulo Witheventi in classe per sottomodulo
- Con eventi nel modulo e dati della classe
- Coneventi e Access Report Event Sink
- Nascondi con eventi e riga di rapporto
- Evidenziazione con eventi e riga di report
- Withevents Texbox e Command Button
- Pulsante di comando con la casella di testo degli eventi
- Coneventi e tutti i tipi di controllo modulo