परिचय।
हम एमएस-एक्सेस में ट्री व्यू कंट्रोल पर ड्रैग एंड ड्रॉप ऑपरेशंस से परिचित हैं जो नोड्स को पुनर्व्यवस्थित करता है। ट्रीव्यू कंट्रोल नोड्स के लिए सभी आधार रिकॉर्ड एकल एक्सेस टेबल से आते हैं। हम हमेशा स्रोत नोड के ParentID . को अपडेट करते हैं ट्री व्यू कंट्रोल पर स्थिति में परिवर्तन करने के लिए, एक ही टेबल रिकॉर्ड पर लक्ष्य नोड के आईडी मान के साथ फ़ील्ड मान। रिकॉर्ड भौतिक रूप से कहीं भी स्थानांतरित नहीं होते हैं।
यहां, ट्री व्यू कंट्रोल के साथ लिस्ट व्यू कंट्रोल को जोड़ने के साथ, हम दो अलग-अलग एक्सेस टेबल के साथ काम करने की योजना बना रहे हैं।
- lvश्रेणी - श्रेणी कोड और विवरण।
- lvProducts - श्रेणीवार उत्पाद।
इस तरह दोनों टेबल्स के बीच संबंध को समझना आसान हो जाता है। ट्री व्यू कंट्रोल पर जब एक उत्पाद आइटम (लिस्ट व्यू आइटम) एक श्रेणी से दूसरी श्रेणी में जाता है, तो हमें क्या परिवर्तन करना है और कहां करना है।
lvश्रेणी एक्सेस टेबल में ट्री व्यू नोड्स और lvProducts . के लिए 20 रिकॉर्ड हैं सूची दृश्य नियंत्रण के लिए तालिका में 45 है। उत्पाद तालिका में एक या अधिक रिकॉर्ड सीधे श्रेणी तालिका पर उत्पाद श्रेणी से संबंधित होते हैं। उनके बीच संबंध को उत्पाद तालिका के ParentID पर श्रेणी आईडी (CID) फ़ील्ड मान के साथ अद्यतन किया गया है फ़ील्ड ताकि उत्पाद की श्रेणी में परिवर्तन तुरंत सूची दृश्य नियंत्रण पर दिखाई दे।
डेमो डेटा तालिका Microsoft Access नमूना डेटाबेस Northwind.accdb से ली गई थी और इसे दो भागों में विभाजित किया गया था।
lvProduct रिकॉर्ड के पेरेंटआईडी फ़ील्ड मान के आधार पर, हम ListView नियंत्रण में सभी संबंधित उत्पाद आइटम को फ़िल्टर और सूचीबद्ध कर सकते हैं, जब TreeView नियंत्रण पर एक श्रेणी नोड का चयन किया जाता है।
जिन विषयों पर हमने अभी तक चर्चा की है।
ट्री व्यू पर मुख्य विषय निम्नलिखित हैं:, छविसूची , इमेजकॉम्बो, और सूची दृश्य नियंत्रण, हमने अब तक MS-Access में शामिल किया है:
- माइक्रोसॉफ्ट ट्री व्यू कंट्रोल ट्यूटोरियल
- ट्री व्यू कंट्रोल के साथ एक्सेस मेनू बनाना
- ट्री व्यू कंट्रोल को इमेज असाइन करना
- ट्री व्यू कंट्रोल-2 में इमेज असाइन करना
- ट्री व्यू कंट्रोल चेक-मार्क ऐड डिलीट नोड्स
- ट्री व्यू इमेजकॉम्बो ड्रॉप-डाउन एक्सेस मेनू
- ट्री व्यू नोड्स को ड्रैग एंड ड्रॉप द्वारा पुनर्व्यवस्थित करें
- एमएस-एक्सेस ट्री व्यू के साथ लिस्ट व्यू कंट्रोल
द लिस्ट व्यू ड्रैग-ड्रॉप टास्क।
जहां तक लिस्ट व्यू के ड्रैग एंड ड्रॉप ऑपरेशन का सवाल है, यह अकेले ट्री व्यू कंट्रोल के भीतर उसी विधि की तुलना करने वाला एक सरल अभ्यास है। चूंकि ड्रैग ड्रॉप एक्शन में ट्री व्यू और लिस्ट व्यू कंट्रोल दोनों शामिल हैं, हम कुछ सरल वीबीए कोड के साथ एक ही ट्री व्यू0_OLEDragDrop() इवेंट प्रक्रिया का उपयोग करते हैं।
सूची दृश्य नियंत्रण में सूचीबद्ध उत्पाद आइटम ट्री व्यू नियंत्रण में चयनित वर्तमान श्रेणी आइटम से संबंधित हैं।
उपयोगकर्ता सूची दृश्य नियंत्रण से एक विशेष उत्पाद आइटम का चयन करता है, यदि वह सोचता है कि यह किसी भिन्न श्रेणी के आइटम से संबंधित है, तो इसे TreeViewCcontrol पर लक्ष्य श्रेणी आइटम पर खींचें और छोड़ें।
स्थानांतरित सूची दृश्य उत्पाद आइटम को उन वस्तुओं की सूची में जोड़ा जाएगा जो परिवर्तित श्रेणी से संबंधित हैं। उत्पाद रिकॉर्ड का पेरेंटआईडी फ़ील्ड मान लक्ष्य श्रेणी रिकॉर्ड आईडी (सीआईडी मान) के साथ अपडेट हो जाता है।
यह केवल एकतरफा कार्रवाई है, हमेशा ListView आइटम को एक श्रेणी से ले जाएं और इसे TreeView नियंत्रण पर किसी भिन्न श्रेणी नोड पर छोड़ दें।
ListView ड्रैग-ड्रॉप डेमो एक्सेस फॉर्म frmListViewDrag' का परीक्षण रन स्क्रीन चित्र नीचे दिया गया है:
उपरोक्त छवि में, पेय पदार्थ TreeView पर श्रेणी का चयन किया गया है। पेय पदार्थ श्रेणी से संबंधित उत्पादों को सूची दृश्य नियंत्रण में सूचीबद्ध किया गया है।
उपरोक्त प्रपत्र का डिज़ाइन दृश्य:
प्रपत्र पर नियंत्रण नामों की सूची नीचे दी गई है:
- ट्री व्यू कंट्रोल:ट्री व्यू0
- सूची दृश्य नियंत्रण:सूची दृश्य0
- छविसूची नियंत्रण:छविसूची3
- कमांड बटन:cmdClose
frmListViewDrag . पर VBA कोड क्लास मॉड्यूल:
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
परिचित VBA कोड सेगमेंट।
Form_Load() . में घटना प्रक्रिया, हम ट्रीव्यू, लिस्ट व्यू, इमेजलिस्ट कंट्रोल को इनिशियलाइज़ करते हैं। यह ColumnHeadings . बनाता है लिस्टव्यू कंट्रोल में लिस्ट आइटम्स को पॉप्युलेट करने से पहले लिस्ट व्यू कंट्रोल का। इस रूटीन के अंत में, हम LoadTreeView () सबरूटीन कहते हैं।
LoadTreeView() सबरूटीन lvCategory के रिकॉर्ड के साथ, TreeView नियंत्रण पर उत्पादों के श्रेणी नोड्स को पॉप्युलेट करता है टेबल। ट्री व्यू कंट्रोल पर नोड्स लोड करना दो चरणों वाली प्रक्रिया है। ऐसा एक बार में करने के बजाय ऐसा क्यों है? इस पहलू को पहले के एक पेज, 7वें लिंक . पर विस्तार से समझाया गया है ऊपर दिए गए लिंक की सूची में यदि आप इसके माध्यम से जाना चाहते हैं। उन सभी को यहाँ दोहराना शायद उचित न हो।
उपरोक्त सबरूटीन के अंत में, LoadListView() सबरूटीन को प्रथम श्रेणी रिकॉर्ड के CID मान के साथ बुलाया गया है 1 पैरामीटर के रूप में।
पेरेंटआईडी फ़ील्ड मान वाले उत्पाद रिकॉर्ड 1 फ़िल्टर किया गया है और ListView नियंत्रण पर सूचीबद्ध किया गया है। इस प्रक्रिया को पिछले सप्ताह की पोस्ट में विस्तार से समझाया गया था, ऊपर दिए गए लिंक की सूची में से 8वां आइटम।
द ड्रैग-ड्रॉप एक्शन सबरूटीन्स।
ड्रैग एंड ड्रॉप एक्शन से जुड़े निम्नलिखित सबरूटीन्स को नीचे प्रस्तुत किए गए क्रम में स्वचालित रूप से निष्पादित किया जाएगा:
- ट्री व्यू0_OLEStartDrag()
- ट्री व्यू0_OLEDragOver()
- ट्री व्यू0_OLEDragDrop()
- ट्री व्यू0_OLECompleteDrag()
पहले और आखिरी सबरूटीन्स शामिल नोड्स को इनिशियलाइज़ करते हैं और क्रमशः अंत में उनकी स्थिति को रीसेट करते हैं।
दूसरा, OLEDragOver() सबरूटीन, MouseMove Event प्रक्रिया की तरह काम करता है और ड्रैग-ड्रॉप ऑपरेशन के दौरान माउस की गति को ट्रैक करता है। जब माउस एक नोड के ऊपर होता है तो यह NodeText को हाइलाइट करता है और बाईं माउस बटन जारी होने तक इसके प्रक्षेपवक्र को ट्रैक करता है।
केवल TreeView0_OLEDragDrop() प्रक्रिया कोड नीचे सूचीबद्ध है।
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
ड्रैग ड्रॉप एक्शन स्टेप बाय स्टेप।
ड्रॉप एक्शन को पूरा करने के लिए बाईं माउस बटन जारी होने के तुरंत बाद TreeView0_OLEDragDrop () प्रक्रिया निष्पादित होती है। कोड की शुरुआत में, सक्रिय और लक्ष्य ट्री व्यू नोड के संदर्भ tv_nodSource में सहेजे गए हैं और tv_nodTarget वस्तु चर क्रमशः।
इसके बाद, हम एक जांच करते हैं कि ListItem को वैध TreeView नोड पर छोड़ दिया गया है या नहीं। यदि इसे उसी स्रोत श्रेणी नोड पर या ट्री व्यू कंट्रोल पर खाली क्षेत्र पर गिरा दिया जाता है तो ये चालें मान्य नहीं होती हैं। यदि इसे TreeView नियंत्रण के खाली क्षेत्र में गिरा दिया गया है तो tv_nodTarget ऑब्जेक्ट वेरिएबल में मान कुछ भी नहीं होगा। उस स्थिति में, यह एक संदेश प्रदर्शित करता है और कार्यक्रम से बाहर निकलता है।
इसके बाद, TreeView स्रोत और लक्ष्य नोड कुंजी मान दो स्ट्रिंग चर में सहेजे जा रहे हैं। यदि दोनों कुंजियाँ समान हैं तो ListItem को ट्री व्यू कंट्रोल पर अपने पैरेंट नोड (श्रेणी नोड) पर खींचा और गिराया गया। कार्यक्रम निष्पादन को आगे बढ़ने से रोक दिया गया है।
यदि दोनों कुंजियाँ भिन्न हैं तो उत्पाद रिकॉर्ड के ParentID पर परिवर्तन को अद्यतन करने का समय आ गया है लक्ष्य श्रेणी रिकॉर्ड के CID . के साथ फ़ील्ड कोड, और ListView आइटम रीफ्रेश करें।
चयनित ListItem का मुख्य मान (PID .) फ़ील्ड मान) strListItemKey . में सहेजा गया है स्ट्रिंग चर।
श्रेणी रिकॉर्ड का वास्तविक CID उपसर्ग वर्ण मान X को अलग करके लक्ष्य नोड से फ़ील्ड मान निकाला गया है और चर vCatID में सहेजा गया है . ListItem को नई श्रेणी के अंतर्गत रखने के लिए, यह वह मान है जिसे हम उत्पाद रिकॉर्ड के पेरेंटआईडी फ़ील्ड पर अपडेट करेंगे।
इसी तरह, चयनित सूची आइटम के उत्पाद की कुंजी PID मान को चर lngPID में निकाला और सहेजा गया है . इसे vCatID के साथ पेरेंटआईडी फ़ील्ड को अपडेट करने के लिए उस विशेष उत्पाद रिकॉर्ड को फ़िल्टर करने और चुनने के लिए मानदंड के रूप में उपयोग किया गया है ।
एक अपडेट करें क्वेरी SQL को lngPID . का उपयोग करके रिकॉर्ड को फ़िल्टर करने के लिए बनाया गया है उत्पाद रिकॉर्ड को फ़िल्टर करने और vCatID . को अपडेट करने के लिए मानदंड के रूप में कोड P . में मान arentID फ़ील्ड.
निष्पादित करें Currentdb . की विधि SQL के साथ बुलाया गया है और परिवर्तन को अद्यतन करता है।
नोड की हाइलाइट को स्रोत नोड पर रीसेट कर दिया गया है।
इसके बाद, TreeView0_NodeClick() सबरूटीन को tv_nodSource के साथ बुलाया गया है ListView नियंत्रण पर परिवर्तन को प्रतिबिंबित करने के लिए एक पैरामीटर के रूप में।
बंद करें बटन क्लिक करने से फॉर्म बंद हो जाएगा।
डेमो डेटाबेस डाउनलोड करें।
आप डेमो डेटाबेस डाउनलोड कर सकते हैं, ट्रायल रन कर सकते हैं और वीबीए कोड का अध्ययन कर सकते हैं।
आपको नए साल की शुभकामनाएं।
एमएस-एक्सेस इवेंट हैंडलिंग
- घटनाओं के साथ एमएस-एक्सेस क्लास मॉड्यूल
- घटनाओं के साथ और अपनी खुद की घटनाओं को परिभाषित करना
- विथइवेंट्स कॉम्बो लिस्ट टेक्स्टबॉक्स टैब
- एक्सेस फॉर्म कंट्रोल एरेज़ एंड इवेंट
- एक्सेस फॉर्म कंट्रोल एरेज़ और इवेंट-2
- एक्सेस फॉर्म कंट्रोल एरेज़ और इवेंट-3
- उप-प्रपत्र के लिए कक्षा मॉड्यूल में घटनाओं के साथ
- कक्षा मॉड्यूल और डेटा में घटनाओं के साथ
- विथईवेंट और एक्सेस रिपोर्ट इवेंट सिंक
- घटनाओं के साथ और लाइन छुपाने की रिपोर्ट करें
- घटनाओं और रिपोर्ट-लाइन हाइलाइटिंग के साथ
- विथईवेंट टेक्सबॉक्स और कमांड बटन
- विथईवेंट टेक्स्टबॉक्स कमांड बटन
- घटनाओं और सभी प्रपत्र नियंत्रण प्रकारों के साथ