Introduktion.
I det här avsnittet av guiden för kontroll av trädvyn kommer vi att lära oss hur du lägger till/ta bort Knutpunkter. Positionen för Lägg till/Ta bort kandidatobjekt kommer att markeras, där vi vill Add() den nya noden eller till Remove() den markerade noden. Tillägget av noden kan vara på samma nivå som den markerade noden eller som en undernod.
TreeView-kontrollsessionerna hittills.
- Microsoft TreeView Control Tutorial
- Skapa åtkomstmeny med TreeView-kontroll
- Tilldela bilder till TreeView-kontroll
- Tilldela bilder till TreeView Control-2
Den normala vyn för demoträdvyskontrollen på MS-Access Form, med andra kontroller, ges nedan.
Datatabellen för TreeView Controls demo.
Tabellen med namnet Sample, vi använde i den första handledningssessionen, kommer vi att använda här också. Det är en liten tabell med poster över Access Database, tabeller, formulär- och rapportkontrollstrukturer, ordnade i hierarkisk ordning och lätt att förstå.
ID kolumn (Trädvy Nyckel ) är ett AutoNumber-fält.
Nya besökare blir uppdaterade för denna självstudiesession.
Om du inte har gått igenom den första självstudiesessionen kan du ladda ner demodatabasen från den andra sessionssidan:Skapa åtkomstmeny med kontroll över trädvyn. Det finns en tabell i den databasen med namnet:Sample och Form frmSample . Du kan importera dem till din nuvarande databas. Det finns en annan form med namnet frmMenu där och du kan kopiera kommandoknapparna Utöka alla, Komprimera alla, och deras kommandoknapp Klicka på Händelseprocedurer från frmMenu till frmSample Kodmodul för att fortsätta med denna session.
Som jag har nämnt tidigare kan vi dela ImageList Control, med de uppladdade bilderna till andra projekt, vi kommer att göra en kopia av ImageList Control från den senaste handledningssessionen och ta den hit, med alla uppladdade bilder, och använda den på Trädvyskontrollnoder på frmSample .
Importera ImageList Control med bilder.
Du kan ta in den ImageList Control du redan har, med uppladdade bilder i en annan databas, på följande sätt:
-
Importera formuläret med ImageList-kontrollen till den aktiva databasen, från databasen där du har ImageList-kontrollen med manuellt uppladdade bilder. Kopiera och klistra in ImageList-kontrollen till formuläret där du vill ha den.
-
Eller kopiera ImageList-kontrollen till Urklipp, från databasen, där du har den, först. Om du har laddat ner demodatabasen från den tidigare handledningssessionen har du redan ImageList Control med uppladdade bilder. Stäng databasen efter att ha kopierat ImageList-kontrollen till Urklipp.
-
Öppna måldatabasen och öppna formuläret där du vill ha ImageList-kontrollen och klistra in den på formuläret.
Med följande kodrader i CreateTreeView() Underrutin kan du skicka ImageList Object Reference till trädvykontrollen.
Dim tv As MSComctlLib.TreeViewDim ImgList As MSComctlLib.ImageListSet tv =Me.TreeView0 .Objecttv.Nodes.ClearSet ImgList =Me.ImageList0 .Objecttv.ImageList =ImgList
Ändra de markerade objektnamnen i koden, om de är olika på formuläret.
Efter det kan du lägga till bildnyckelnamnen i TreeView Nodes.Add() metodens två sista parametrar.
Dessa övningar har vi redan gjort i de tidigare sessionerna. För att påminna dig använder vi tabell- och trädvyskontrollen som vi skapade i den första handledningssessionen och implementerade med de ovan förklarade ändringarna.
Visa egenskapsvärdena för bockmarkerade noder.
Den valda nod-nyckeln , Föräldranyckel, och Text Egenskaper visas i textrutorna till höger om trädvykontrollen. Kryssrutan med bildtexten:Child Node, Ta bort Nod, och Lägg till nod Kommandoknappar är nya tillägg till formuläret. Deras funktioner kommer att förklaras inom en kort stund.
Visa kryssrutor på TreeView-kontrollen.
Normalt visas inte kryssrutan på TreeView-kontrollen, såvida vi inte aktiverar en egenskap i trädvykontrollens egenskapsblad. Den har bara en viss begränsad funktionalitet här. Vad vi än ska göra här kan också göras utan kryssrutan.
Ett bättre tillvägagångssätt för användningen av checkboxar kan vara, som utarbetande av en rapport om utvalda filialplatser för företagets verksamheter, baserat på användarvalbara slumpmässiga val av filialer, från Access Project Menu.
Här är syftet att ge en medvetenhet om denna funktion och köra en demo om dess användning.
- Öppna formuläret med TreeView-kontrollen i designvyn.
- Högerklicka på TreeView-kontrollen, markera TreeCtrl-objektet , välj Egenskaper alternativet för att visa egenskapsbladet.
- Sätt bockmarkering på kryssrutorna alternativet på Egenskapskontrollen som visas i bilden nedan.
Demo TreeView-bilden som visas överst, Detaljer.
Låt oss se vad vi har på demoformuläret frmSample presenteras överst på denna sida. Trädvyskontrollen och de två översta kommandoknapparna, Utöka alla och Komprimera alla, på Klicka på Expanderar eller komprimerar noderna och vi har sett deras funktioner i det senaste avsnittet.
På höger sida finns tre textrutor, under rubriken Etikett:Egenskapsvärden , för att visa nodens nyckel , Föräldranyckel, och Text Värden.
Ta bort nod Kommandoknapp tar bort den markerade noden eller noden och dess undernoder.
Innan du väljer Lägg till nodkommandoknapp , Text Egenskapsvärdet måste redigeras för att ersättas med det nya textvärdet för den nya noden.
Ovanför Lägg till nod Kommandoknapp, det finns en kryssruta med etiketten Child Node. Lägg till nod och Child Node Check-Box arbetar tillsammans för att ställa in regeln för var den nya noden ska visas.
Förstå åtgärden Lägg till nod.
Anta att du vill lägga till en ny nod för Hyperlänk fältet under Fält grupp (eller överordnad nod) datatyp Lista. Titta på demobilden överst på den här sidan, där jag har markerat Datumfältet Node, bland andra Child-Nodes. Egenskapsbladen på höger sida visar dess nyckel:X15 , ParentKey:X4 &Text:Datumfält Beskrivning.
Ändra texten:Datumfält till Hyperlänk i egenskapsvisningstextrutan och klicka på Lägg till nod Kommandoknapp. Utgången blir som visas nedan:
Om du markerar fälten parent Node-objektet och markera Child-Node alternativet ovanför Lägg till nod Kommandoknapp, du får samma resultat.
Istället, om du behåller noden i Datumfältet och markera Child-Node alternativet ovanför Lägg till nod Kommandoknapp, du får resultatet som visas nedan.
Den underordnade noden kommer att skapas under den bockmarkerade noden.
Åtgärderna Lägg till nod måste först skapa en ny post i den underliggande tabellen.
En ny post skapas i Samplet Tabell, med den nya texten:Hyperlänk och Föräldra-ID Värderingar. AutoNumber-fältet genererar ett nytt nummer och vi hämtar det och använder det som nyckel-värde för noden.
Lägg till nod underrutin VBA-koden ges nedan:
Private Sub cmdAdd_Click()Dim strKey As StringDim lngKey As LongDim strParentKey As StringDim lngParentkey As LongDim strText As StringDim lngID As LongDim strIDKey As StringDim childflag As IntegerDim db As DAO.DatabaseD As StrSfno MSCom As Integeri =0För varje tmpnode I tv.Nodes If tmpnode.Checked Then tmpnode.Selected =True i =i + 1 End IfNextIf i> 1 Then MsgBox "Selected Nodes:" &i &vbCr &"Välj endast en nod för att markera tillägg .", vbCritical, "cmdAdd()" Avsluta SubEnd If'Read egenskapsvärden från FormstrKey =Trim(Me![TxtKey])lngKey =Val(Mid(strKey, 2))strParentKey =Trim(Me![TxtParent])lngParentkey =IIf(Len(strParentKey)> 0, Val(Mid(strParentKey, 2)), 0)strText =Trim(Me![Text])'Read child Node Option settingchildflag =Nz(Me.ChkChild.Value, 0)intflag =0strSql ="INSERT INTO Sample ([Desc], [ParentID] ) "Om lngParentkey =0 Och childflag =0 Sedan 'Lägg till rotnivånod, ParentKey i s Tom strSql =strSql &"SELECT '" &strText &"' AS [Desc], '" &" " strSql =strSql &"' AS ParentID FROM Sample WHERE ((Sample.ID =1));" i ], '" &lngKey strSql =strSql &"' SOM föräldra-ID FRÅN Sample WHERE ((Sample.ID =1));" i '" &lngParentkey strSql =strSql &"' AS ParentID FROM Sample WHERE ((Sample.ID =1));" i nivånod, ParentKey är Blank tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open" Fall 2 'Infogar en underordnad nod till den bockmarkerade noden, här Nyckelvärde som används som ParentKey tv.Nodes.Add strKey , tvwChild, strIDKey, strText, "left_arrow", "right_arrow" Fall 3 'Infogar nod på den bockmarkerade nivån, Lägg till objekt under samma ParentKey tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", " right_arrow"End Selecttv.Refresh 'Radera egenskapsvärden från Form With Me .TxtKey ="" .TxtParent ="" .Text ="" Avsluta WithSet db =NothingcmdExpand_Click cmdAdd_Click_Exit:Exit SubIdxOutofBound:CreateTreeExitEndCreateTreeViewdReLåt oss undersöka VBA-koden. Efter de lokala variabeldeklarationerna skannas TreeView-noderna efter bockar och tar ett antal bockmarkerade objekt. Om markerade noder är fler än en visar det ett meddelande och avbryter programmet.
Obs! Istället för att markera kan vi klicka direkt på en nod för att välja den. I båda fallen skickas den markerade/klickade noden som en parameter till händelseproceduren. Markering är bra när du behöver välja mer än ett objekt från en projektmeny, till exempel:för att välja en annan uppsättning data för en viss rapport, etc.
Den markerade nodens egenskapsvärden läses från formulärkontrollerna till strKey , strParentKey, och strText. ID, ParentID Numeriska värden extraheras och sparas i lngKey och lngParentKey Variabler för användning i SQL String.
Därefter Child-Node Kryssrutans värde sparas i ChildFlag Variabel.
Tre olika uppsättningar av SQL-strängar skapas baserat på vald Nod och Child-Node Kryssrutan ovanför kommandoknappen Lägg till nod.
- Om förälder-ID Egenskapsvärdet på formuläret är tomt och Child Node kryssrutan är inte markerad, då skapas en ny post på rotnivå eftersom användaren har markerat en nod på rotnivå.
- Om förälder-ID Egenskapsvärde>=0 och Child Node kryssrutan är markerad (markerad ) sedan skapas en ny post som en Child-Node till den bockmarkerade noden. Den bockmarkerade nodens nyckel (ID) används som föräldra-ID på den nya posten för den nya noden.
- Om förälder-ID Värde >=0 och Child Node kryssruta alternativet inte markerat (ej markerat ) då skapas den nya posten för den nya noden, på samma nivå som den bockmarkerade noden.
intFlag Variabel ställs in med ett av de tre värdena:1,2 eller 3, beroende på exekveringen av SQL, som en indikation på vilken typ av nod som ska skapas på trädvyskontrollen.
Därefter, baserat på urvalet av alternativ, exekveras SQL för att skapa New Record på Samplet Tabell, med ett nytt AutoNumber ID-fältvärde.
Nästa, DMax() Funktionen returnerar det unika post-ID som nyckel-värde för den nya noden.
Baserat på alternativet Nodtyp (1,2 eller 3) skapas noden på trädvykontrollen.
Innehållet i textrutan för egenskapsvisning rensas.
Ta bort nod eller nod med barn.
Ta bort noden Alternativ är mycket lättare än den tidigare övningen. Tar helt enkelt bort den bockmarkerade noden och dess underordnade, om sådana finns, från trädvykontrollen. De relaterade posterna tas också bort från tabellen.
VBA-koden för nodborttagning ges nedan:
Privat Sub cmdDelete_Click()Dim nodId As Long, nodParent As LongDim strSql As StringDim db As DAO.DatabaseDim j As IntegerDim tmpnode As MSComctlLib.NodeDim strKey As StringDim strMsg As Stringjnode =0 Markerad tv.Nodes If tmpnode.Checked Then tmpnode.Selected =True strKey =tmpnode.Key j =j + 1 End IfNext If j> 1 Then MsgBox "Selected Nodes:" &j &vbCr &"Select Only One Node to Delete." , vbCritical, "cmdDelete()" Exit Sub End IfSet tmpnode =tv.Nodes.Item(strKey)tmpnode.Selected =TrueSet db =CurrentDb'kontrollera närvaron av undernod(er) för markerade NodeIf tmpnode.Children> 0 Then' Varningar:' Att radera noder slumpmässigt kommer att lämna föräldralösa noder i tabellen och sluta med fel under nästa laddningsprocess för trädvyn strMsg ="Den markerade noden har " &tmpnode.Children &" Children. " &vbCr &"Ta bort Barnnoder också?" Om MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") =vbYes Sedan 'Dubbelkolla och få bekräftelse. strMsg ="Ta bort endast den djupaste uppsättningen av underordnade noder" &vbCr strMsg =strMsg &"och deras överordnade nod på en gång." &vbCr &vbCr strMsg =strMsg &"Är du säker på att du ska fortsätta...?" Om MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") =vbYes Then Do Until tmpnode.Children =0 nodId =Val(Mid(tmpnode.Child.Key, 2)) 'Delete Child Node tv.Nodes.Remove tmpnode. .Child.Index 'Ta bort den relaterade posten strSql ="DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)=" &nodId &"));" db.Execute strSql Loop Else Exit Sub End If Else Exit Sub End IfEnd If nodId =Val(Mid(tmpnode.Key, 2)) 'Delete Parent tv.Nodes.Remove tmpnode.Key tv.Refresh 'Delete Marked Record strSql =" DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)=" &nodId &"));" db.Execute strSql 'Radera egenskapsvärden från Form With Me .TxtKey ="" .TxtParent ="" .Text ="" Avsluta med Set db =Ingenting End SubEfter de lokala variabeldeklarationerna visas För varje . . . Nästa Loop tar ett antal noder med bockar. Om det finns mer än en bockmarkerad post visas ett meddelande och programmet avbryts.
Om det bara är ett objekt markerat, letar det andra steget Valideringskontrollen efter närvaron av underordnade noder för den valda noden. Om underordnade noder hittas visas ett meddelande om den effekten. Användaren måste bekräfta sin avsikt att gå vidare för att ta bort de underordnade noderna först och sedan den bockmarkerade överordnade noden.
Obs! Användare rekommenderas att ta bort den djupaste nivån av underordnade noder först, eller alla underordnade noder på djupaste nivån med sin omedelbara överordnade nod, genom att endast markera den överordnade noden, inte markera farföräldernoden. Om du begränsar raderingsregeln till denna nivå kommer koden att hållas enkel och lätt att förstå. Om du bryter mot denna regel kan vissa noder bli föräldralösa och sluta med fel när trädvyn öppnas nästa gång .
Barnnoderna tas bort en efter en och motsvarande poster på bordet raderas också, en efter en. Raderar sedan den markerade överordnade posten.
Om den markerade noden inte har några underordnade noder tas den bort omedelbart efter valideringskontrollerna och motsvarande tabellpost tas också bort.
Innehållet i textrutan för egenskapsvisning i formuläret rensas.
Formuläret frmSample's Complete Class Module VBA-kod.
Följande är den fullständiga VBA-koden i frmSample s klassmodul, med andra små underrutiner för att expandera kollapsande noder, TreeView0_NodeCheck Händelseprocedur, cmdExit Kommandoknapp Klicka på Händelse, Form_Load() Procedurer och CreateTreeView() Subrutin:
Alternativ Jämför DatabaseOption ExplicitDim tv As MSComctlLib.TreeViewDim ImgList As MSComctlLib.ImageListConst KeyPrfx As String ="X"Private Sub cmdAdd_Click()Dim strKey As StringDim lngKey As LongDim StrkeyD AsTim strParent AsIDKy StringD AsLongDim strParent AsIDK StringDim childflag As IntegerDim db As DAO.DatabaseDim strSql As StringDim intflag As IntegerDim tmpnode As MSComctlLib.NodeDim i As Integeri =0För varje tmpnode I tv.Nodes If tmpnode.Checked =TrueSend i>elext iN =TrueSend. 1 Sedan MsgBox "Valda noder:" &i &vbCr &"Välj endast en nod för att markera tillägg.", vbCritical, "cmdAdd()" Avsluta SubEnd If'Read egenskapsvärden från FormstrKey =Trim(Me![TxtKey])lngKey =Val(Mid(strKey, 2))strParentKey =Trim(Me![TxtParent])lngParentkey =IIf(Len(strParentKey)> 0, Val(Mid(strParentKey, 2)), 0)strText =Trim(Me![ Text])'Läs barnnodalternativ settingchildflag =Nz(Me.ChkChild.Value, 0)intflag =0strSql ="INSERT INTO Sample ([Desc], [ParentID] ) "Om lngParentkey =0 Och childflag =0 Sedan 'Lägg till rotnivånod, ParentKey är Blank strSql =strSql &"SELECT '" &strText &"' AS [ Desc], '" &" " strSql =strSql &"' AS ParentID FROM Sample WHERE ((Sample.ID =1));" i ], '" &lngKey strSql =strSql &"' SOM föräldra-ID FRÅN Sample WHERE ((Sample.ID =1));" i '" &lngParentkey strSql =strSql &"' AS ParentID FROM Sample WHERE ((Sample.ID =1));" i nivånod, ParentKey är Blank tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open" Fall 2 'Infogar en underordnad nod till den bockmarkerade noden, här Nyckelvärde som används som ParentKey tv.Nodes.Add strKey , tvwChild, strIDKey, strText, "left_arrow", "right_arrow" Fall 3 'Infogar nod på den bockmarkerade nivån, Lägg till objekt under samma ParentKey tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", " right_arrow"End Selecttv.Refresh 'Radera egenskapsvärden från Form With Me .TxtKey ="" .TxtParent ="" .Text ="" Avsluta WithSet db =NothingcmdExpand_Click cmdAdd_Click_Exit:Exit SubIdxOutofBound:Create cm_TreeAddClosee cmdExpand_Click Click() DoCmd.CloseEnd SubPrivate Sub cmdDelete_Click()Dim nodId As Long, nodParent As LongDim strSql As StringDim db As DAO.DatabaseDim j As IntegerDim tmpnode As MSComctlLib.NodeDim strKey =Key =String Ascount StringDim Varje tmpnode In tv.Nodes If tmpnode.Checked Then tmpnode.Selected =True strKey =tmpnode.Key j =j + 1 End IfNext If j> 1 Then MsgBox "Selected Nodes:" &j &vbCr &"Select Only One Node to Delete.", vbCritical, "cmdDelete()" Exit Sub End IfSet tmpnode =tv.Nodes.Item(strKey)tmpnode.Selected =TrueSet db =CurrentDb'kontrollera närvaron av Child Node(s) för markerade NodeIf tmpnode.Children> 0 Sedan'Varningar:' Att radera noder slumpmässigt kommer att lämna föräldralösa noder i tabellen och sluta med fel, under nästa laddningsprocess för trädvy strMsg ="Den markerade noden har " &tmpnode.Children &" barn. " &vbCr &"Ta bort underordnade noder också?" Om MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") =vbYes Sedan 'Dubbelkolla och få bekräftelse. strMsg ="Ta bort endast den djupaste uppsättningen underordnade noder" &vbCr strMsg =strMsg &"och deras modernod samtidigt." &vbCr &vbCr strMsg =strMsg &"Är du säker på att du ska fortsätta...?" If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") =vbYes Gör sedan tills tmpnode.Children =0 nodId =Val(Mid(tmpnode.Child.Key, 2)) 'Delete Child Node tv.Nodes.Remove tmpnode.Child.Index 'Ta bort den relaterade posten strSql ="DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)=" &nodId &"));" db.Execute strSql Loop Else Exit Sub End If Else Exit Sub End IfEnd If nodId =Val(Mid(tmpnode.Key, 2 )) 'Delete Parent tv.Nodes.Remove tmpnode.Key tv.Refresh' 'Delete Marked Recor d strSql ="DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)=" &nodId &"));" db.Execute strSql 'Radera egenskapsvärden från Form With Me .TxtKey ="" . TxtParent ="" .Text ="" Avsluta med Set db =Ingenting Slut SubPrivate Sub cmdExpand_Click()Dim nodExp As MSComctlLib.Node For Every nodExp In tv.Nodes nodExp.Expanded =True NextEnd SubPrivate Sub cmdCollapse_Click(LibDCollapse_ClickEx. Nod för varje nodExp i tv.Nodes nodExp.Expanded =False NextEnd SubPrivate Sub Form_Load() CreateTreeView cmdExpand_ClickEnd SubPrivate Sub CreateTreeView()Dim db As DatabaseDim rst As RecordsetDim nodKey As StringDim As Strey Asree string Asree stringDK Strey tv. .Objecttv.Nodes.Clear'Pass ImageList kontrollreferens till TreeViews ImageList Property.Set ImgList =Me.ImageList0.Objecttv.ImageList =ImgListstrSql ="SELECT ID, Desc, ParentID FROM Sample;"Set db =CurrentDbSet rst =db.OpenRecordset("sample", dbOpenTable)Do While Not rst.EOF And Not rst.BOF If Nz(rst!PrentID, "") ="" Då nodKey =KeyPrfx &CStr(rst!ID) strText =rst!desc tv.Nodes.Add , , nodKey, strText, "folder_close", "folder_open" Annars ParentKey =KeyPrfx &CStr(rst!ParentID) nodKey =CStrPr(fx rst!ID) strText =rst!desc tv.Nodes.Add ParentKey, tvwChild, nodKey, strText, "left_arrow", "right_arrow" End Ifrst.MoveNextLooprst.CloseOn Error GoTo 0Set rst =NothingSet db =NothingSet SubPrivate NothingalTreeckyde As Object) Dim xnode As MSComctlLib.NodeSet xnode =Node If xnode.Checked Then xnode.Selected =True With Me .TxtKey =xnode.Key If xnode.Text =xnode.FullPath Then .TxtParent ="" Else .TxtParent Parent.Key End If .Text =xnode.Text End With Else xnode.Selected =False With Me .TxtKey ="" .TxtParent ="" .Text ="" End WithEnd IfEnd SubDesignvyn av frmSample Form ges nedan:
Dina observationer, kommentarer, förslag är välkomna.
Demodatabasen bifogas för nedladdning.
ORDBOKSOBJEKT
- Grundläggande ordbokobjekt
- Dictionary Object Basics-2
- Sortera ordboksobjektnycklar och objekt
- Visa poster från ordbok
- Lägg till klassobjekt som ordboksobjekt
- Uppdatera Class Object Dictionary Item