Access
 sql >> डेटाबेस >  >> RDS >> Access

ट्री व्यू नोड्स को ड्रैग एंड ड्रॉप द्वारा पुनर्व्यवस्थित करें

परिचय।

मुझे आशा है कि आपने पिछले सप्ताह ImageCombo Control पर आपके Microsoft Access प्रोजेक्ट्स के लिए उपयोगी ट्यूटोरियल पाया है। ट्री व्यू इमेजकॉम्बो कंट्रोल के साथ, हम कई विकल्पों के साथ एक सुंदर ड्रॉप-डाउन मेनू बना सकते हैं, और इसे फॉर्म पर एक छोटी सी जगह में समायोजित कर सकते हैं।

इसी तरह, पिछले सत्र में, हमने सीखा है कि नोड पदानुक्रम पर एक विशिष्ट स्थान में नए नोड्स कैसे जोड़ें या ट्री व्यू कंट्रोल पर एक नोड को स्थानांतरित करने के लिए एक नोड को हटाएं और एक नया जोड़ें।

यह विधि नए नोड के लिए स्रोत तालिका में एक नया रिकॉर्ड बनाने का अनुरोध करती है। या मौजूदा नोड को स्थायी बनाने के लिए मौजूदा नोड को स्थानांतरित करने के लिए एक मौजूदा रिकॉर्ड हटाएं और एक नया बनाएं। एक तरह से, ऐड/डिलीट फंक्शन्स के उपयोग से, हम नए नोड्स जोड़ सकते हैं या ट्री व्यू कंट्रोल पर मौजूदा नोड्स को फिर से व्यवस्थित कर सकते हैं। जहां तक ​​नोड्स को फिर से व्यवस्थित करने का संबंध है, हमारे पास नोड्स को हटाने और उन्हें फिर से बनाने के बजाय इसे करने का एक बेहतर तरीका है। नोड को उसके वर्तमान स्थान से खींचें और इसे ट्री व्यू कंट्रोल पर जहां हम चाहते हैं, वहां छोड़ दें। इस कड़ी में हम यही सीखने जा रहे हैं

परिवर्तन को स्थायी बनाने के लिए, इस सरल दृष्टिकोण को केवल संबंधित रिकॉर्ड के पेरेंटआईडी फ़ील्ड मान के परिवर्तन को अद्यतन करने की आवश्यकता है।

पहले के सत्रों में अब तक कवर किए गए विषय।

  1. माइक्रोसॉफ्ट ट्री व्यू कंट्रोल ट्यूटोरियल
  2. ट्री व्यू कंट्रोल के साथ एक्सेस मेनू बनाना
  3. ट्री व्यू कंट्रोल को इमेज असाइन करना
  4. ट्री व्यू कंट्रोल-2 में इमेज असाइन करना
  5. ट्री व्यू कंट्रोल चेक-मार्क ऐड डिलीट नोड्स
  6. ट्री व्यू इमेजकॉम्बो ड्रॉप-डाउन एक्सेस मेनू

लेकिन, इस पद्धति का उपयोग करते समय हमें कुछ चुनौतियों का सामना करना पड़ सकता है और हम इस सत्र में थोड़ी देर बाद आएंगे।

डेमो डेटा टेबल और फॉर्म।

हमें एक टेबल और एक फॉर्म चाहिए। हमारे पास नमूना . नाम की एक उपयुक्त तालिका पहले से मौजूद है पिछले ट्यूटोरियल सत्र में बनाया गया। यदि आप पहले ही ऊपर दिए गए दूसरे लिंक पेज से डेमो डेटाबेस डाउनलोड कर चुके हैं, तो आप इस सत्र के लिए भी उस डेटाबेस का उपयोग कर सकते हैं। हम अपने ड्रैग-ड्रॉप प्रयोगों के लिए उस डेटाबेस से निम्नलिखित वस्तुओं का उपयोग करेंगे:

  • तालिका:नमूना
  • फ़ॉर्म:frmनमूना

डेमो डेटा के साथ frmSample पर ट्री व्यू कंट्रोल इमेज संदर्भ के लिए नीचे दी गई है:

आप डेमो डेटाबेस डाउनलोड कर सकते हैं (ProjectMenu.zip ) ऊपर दिए गए दूसरे लिंक पेज से और ProjectMenu.accdb . निकालें डेटाबेस।

ड्रैग ड्रॉप ट्रायल रन के लिए नया फॉर्म।

  1. ProjectMenu.accdb डेटाबेस खोलें।

  2. तालिका की प्रतिलिपि बनाएं नमूना और इसे नमूना_बीके, . नाम दें इसे सुरक्षित रखें, हमें बाद में बिना किसी बदलाव के इसके मूल डेटा की आवश्यकता होगी। जब हम ड्रैग-ड्रॉप विधि के साथ प्रयोग करते हैं तो नमूना डेमो टेबल पर पेरेंटआईड फ़ील्ड मान को अपडेट करना आवश्यक है। लेकिन, इन परिवर्तनों के बिना, हमें बाद में मूल डेटा की आवश्यकता होगी।

  3. frmDragDrop . नाम से एक नया फ़ॉर्म बनाएं ।

  4. जब आप इसे समाप्त कर लेंगे तो frmDragDrop प्रपत्र डिज़ाइन नीचे दी गई छवि की तरह दिखाई देगा।

  5. ActiveX नियंत्रणों की सूची से TreeView नियंत्रण सम्मिलित करें और इसे नियंत्रण के ऊपर पर्याप्त स्थान छोड़ते हुए प्रपत्र पर रखें, ताकि हम इसके ऊपर दो कमांड बटन और एक शीर्षक लेबल बना सकें। साइज़िंग हैंडल को नीचे दाएं कोने में खींचें ताकि वह इतना बड़ा हो कि सभी नोड्स बिना स्क्रॉल किए प्रदर्शित हो सकें।

  6. नाम . बदलें ट्री व्यू कंट्रोल का संपत्ति मूल्य ट्रीव्यू0 . के लिए ।

  7. ट्री व्यू कंट्रोल के ऊपर और बाएँ किनारे पर एक कमांड बटन डालें। इसका नामबदलें cmdExpand . के लिए प्रॉपर्टी का मान और कैप्शन सभी का विस्तार करें . के लिए मान ।

  8. ऊपर और ट्री व्यू कंट्रोल के दाहिने किनारे पर दूसरा कमांड बटन डालें। इसका नामबदलें संपत्ति का मान cmdसंक्षिप्त . के लिए और कैप्शन संपत्ति का मूल्य सभी को संक्षिप्त करें।
  9. कमांड बटन के ऊपर एक लेबल नियंत्रण डालें, जो ऊपर दिखाए गए अनुसार शीर्षक लिखने के लिए पर्याप्त चौड़ा हो, और उसका फ़ॉन्ट आकार 14.

    बदलें।
  10. इमेजलिस्ट कंट्रोल पर ध्यान न दें, फिलहाल, मैंने कोड लाइन्स पर टिप्पणी की है जो नोड इमेजलिस्ट इंडेक्स नंबरों को संशोधित करती है। बाद में, आप हमारे पहले के ट्यूटोरियल डेमो डेटाबेस (ऊपर दिए गए चौथे लिंक पेज से) से मैन्युअल रूप से अपलोड की गई छवियों के साथ इमेजलिस्ट कंट्रोल को आयात कर सकते हैं और इसका उपयोग नोड्स पर नोड-इमेज प्रदर्शित करने के लिए कर सकते हैं। जब ड्रैग ड्रॉप क्रियाओं के दौरान नोड की स्थिति बदल जाती है, तो हमें ट्री व्यू कंट्रोल पर नोड की स्थिति (रूट-लेवल नोड या चाइल्ड-नोड) के आधार पर नोड इमेज को भी बदलने की आवश्यकता होती है।

    फ़ॉर्म मॉड्यूल कोड खींचें-छोड़ें.

  11. फॉर्म का VBA कोड मॉड्यूल प्रदर्शित करें frmDragDrop, निम्नलिखित VBA कोड को कॉपी और पेस्ट करें (यह फॉर्म मॉड्यूल कोड का केवल पहला भाग है) frmDragDrop फॉर्म के क्लास मॉड्यूल में और फॉर्म को सेव करें:

    विकल्प तुलना DatabaseOption ExplicitDim tv as MSComctlLib.TreeViewDim db as DAO.DatabaseDim rst DAO के रूप में। 'सेट imgListObj =Me.ImageList1.Object'tv.ImageList =imgListObjLoadTreeViewEnd सबसब लोडट्री व्यू () डिम स्ट्रेके को StringDim strPKey के रूप में StringDim strText के रूप में StringDim strsQL के रूप में StringstrsQL ="चयन करें * आईडी द्वारा नमूना आदेश से सेट करें" db =वर्तमान डीबी सेट करें। OpenRecordset(strsQL, dbOpenDynaset) tv.Nodes.Clear'Add सभी आइटम रूट नोड्स के रूप में जोड़े जाते हैं, जबकि rst.BOF और नहीं rst.EOF strKey =KeyPrfx और CStr(rst!ID) strText =rst!desc tv.Nodes.Add , , strKey, strText 'विथ tv.Nodes.Item(strKey)' .Image =1 '। SelectedImage =4 'अंत के साथ rst.MoveNextLoop' जहां कहीं भी लागू हो, बच्चे को स्थानांतरित करने और स्थिति के लिए नोड्स की पेरेंट-कुंजी को अपडेट करने के लिए तैयार करें NodesstrPKey =""rst.MoveFirstDo जबकि rst नहीं। EOF strPK ey =Nz(rst!parentid, "") यदि लेन(strPKey)> 0 तब strPKey =KeyPrfx और strPKey strKey =KeyPrfx और CStr(rst!ID) strText =rst!desc 'बाल नोड को उसके पैरेंट-नोड सेट के अंतर्गत ले जाएँ tv.Nodes.Item(strKey).Parent =tv.Nodes.Item(strPKey) 'अपडेट इमेज और सिलेक्टेड इमेज प्रॉपर्टीज' इमेजलिस्ट इंडेक्स नंबरों के साथ 'tv.Nodes.Item(strKey) के साथ'। इमेज =2 '। सिलेक्टेड इमेज =3 'अंत के साथ अंत अगर rst.MoveNextLooprst.CloseSet rst =कुछ भी नहीं सेट डीबी =कुछ भी नहीं उप-निजी उप ट्री व्यू0_नोडक्लिक (ऑब्जेक्ट के रूप में बायवैल नोड) मंद चयन नोड MSComctlLib.Node के रूप में 'सुनिश्चित करें कि क्लिक किया गया नोड पेड़ में चयनित नोड के बराबर है यदि नोड कुछ भी नहीं है तो सेट करें SelectionNode =नोड यदि SelectionNode.Expanded =True तब SelectionNode.Expanded =False Else SelectionNode.Expanded =True End IfEnd SubPrivate Sub cmdCollapse_Click()Dim tmpnod as MSComctlLib.NodeFor प्रत्येक tmpn od इन tv.Nodes यदि tmpnod.Expanded =True तब tmpnod.Expanded =False end ifNextEnd SubPrivate Sub cmdExpand_Click()Dim tmpnod as MSComctlLib.NodeFor प्रत्येक tmpnod टीवी में। उप

    मुझे पता है कि आप उपरोक्त कोड से परिचित हैं, यदि आप LoadTreeView() को छोड़कर पहले के एपिसोड देख चुके हैं कुछ बदलावों के साथ सबरूटीन। यहां, ट्री व्यू नोड्स को पॉप्युलेट करना दो-चरणीय प्रक्रिया में विभाजित किया गया है।

    संक्षेप में, इस सबरूटीन में यही होता है।

    • के सभी रिकॉर्ड नमूना तालिका को पहले चरण में, कुंजी के रूप में एक आईडी फ़ील्ड मान के साथ, TreeView नियंत्रण के रूट-स्तरीय नोड्स के रूप में लोड किया गया है।

    • फिर से, इन रिकॉर्ड्स को दूसरी बार पढ़ा गया है और ParentId फ़ील्ड, अगर खाली है तो नोड को रूट-लेवल नोड के रूप में बनाए रखा जाएगा।

    • यदि पेरेंटआईडी फ़ील्ड में कोई मान है तो नोड को पेरेंटआईडी मान के साथ नोड-कुंजी के रूप में पहचानें और वर्तमान नोड को उसके चाइल्ड नोड या उसके [Relative] के रूप में स्थानांतरित करें पैरामीटर ( . का जोड़ें () विधि) मान अपडेट हो जाता है।

    • हालांकि ऐसा प्रतीत होता है कि दो-चरणीय नोड पॉप्युलेटिंग प्रक्रिया एक अनावश्यक अभ्यास है, फिर भी हमें इस पद्धति का पालन करने का एक अच्छा कारण है। हम इस पर थोड़ी देर बाद वापस आएंगे और आप इसे बिना ज्यादा व्याख्या किए जान जाएंगे।

    • फॉर्म के डिजाइन पर, मैंने एक इमेजलिस्ट कंट्रोल दिया है। आप ImageList ActiveX नियंत्रण सम्मिलित कर सकते हैं और इसमें कुछ छवियों को डिस्क से मैन्युअल रूप से अपलोड करें, या इस नियंत्रण को पहले के डेमो डेटाबेस डाउनलोड से छवियों के साथ कॉपी और पेस्ट करें। किसी भी स्थिति में, कृपया सुनिश्चित करें कि ImageList नियंत्रण का नाम ImageList1 है। . अन्यथा, आपको कोड में नाम बदलना होगा।

    • उसके बाद, फॉर्म_ओपन () इवेंट प्रक्रिया में टिप्पणी-आउट लाइनों को सक्षम करें। पंक्ति की शुरुआत से टिप्पणी चिह्न हटाकर निम्नलिखित पंक्तियों को सक्षम करें:

      'सेट imgListObj =Me.ImageList1.Object'tv.ImageList =imgListObj

    • ट्री व्यू0_ . में OLEDragDrop() सबरूटीन (VBA कोड के दूसरे भाग में) उन पंक्तियों से भी टिप्पणी प्रतीकों को हटाकर, नोड्स के इमेज इंडेक्स पैरामीटर्स को सक्षम बनाता है। इन परिवर्तनों के साथ, नोड छवियां ट्री व्यू कंट्रोल पर दिखाई देंगी। यदि आपके पास अपलोड की गई छवियों के साथ स्वयं का एक छविसूची नियंत्रण है, तो आप नोड्स पर किस छवि को सम्मिलित करना चाहते हैं, इसके आधार पर अनुक्रमणिका संख्याएं बदलें।

      TreeView0_NodeClick() घटना प्रक्रिया वर्तमान नोड का विस्तार करती है, यदि चाइल्ड-नोड्स ढह गई स्थिति में हैं, अन्यथा, चाइल्ड नोड्स संक्षिप्त हो जाएंगे। आम तौर पर +/- . पर क्लिक करके इस क्रिया को (बिना कोड के) नियंत्रित किया जाता है चाइल्ड नोड्स के साथ नोड की ट्री-लाइन पर प्रतीक।

      सबरूटीन्स cmdExpand_Click() और cmdCollapse_Click() ईवेंट क्रमशः सभी नोड्स का विस्तार करते हैं और सभी नोड्स को संक्षिप्त करते हैं।

      जब उपरोक्त कोड चलता है तो डिस्प्ले नीचे दिए गए फॉर्म व्यू इमेज जैसा दिखता है:

    • आप frmDragDrop . को सहेज सकते हैं फॉर्म करें और इसे नॉर्मल व्यू में खोलें। अगर सब कुछ ठीक रहा तो आपको ऊपर की स्क्रीन दिखाई देगी। सभी का विस्तार करें . आज़माएं और सभी को संक्षिप्त करें कमांड बटन और जांचें कि क्या वे भी काम कर रहे हैं। यदि नहीं, तो फिर से जांचें कि निम्नलिखित सेटिंग्स सही हैं या नहीं:

    • i) ट्री व्यू कंट्रोल का नाम है:ट्री व्यू0

    • ii) सभी का विस्तार करें . की संपत्ति पत्रक प्रदर्शित करें कमांड बटन और ऑन क्लिक . में [इवेंट प्रक्रिया] चुनें घटना संपत्ति।

    • iii) सुनिश्चित करें कि सभी को संक्षिप्त करें . के लिए वही सेटिंग बरकरार है कमांड बटन भी।

    • iv) चाइल्ड नोड्स वाले नोड पर क्लिक करें, यह देखने के लिए कि क्या वे बार-बार क्लिक करने पर ढह जाते हैं या फैल जाते हैं।

    • v) यदि प्रपत्र पर ImageList नियंत्रण रखा गया है तो उसका नाम ImageList1 होना चाहिए।

      आइए वीबीए कोड के दूसरे भाग के साथ आगे बढ़ते हैं जो ड्रैग-ड्रॉप इवेंट को लागू करता है।

    VBA कोड का दूसरा भाग।

  12. VBA कोड के निम्नलिखित दूसरे भाग को frmDragDrop फॉर्म मॉड्यूल पर कॉपी करें, जो ड्रैग-ड्रॉप क्रिया को लागू करता है, और इसे मौजूदा कोड के नीचे पेस्ट करें:

    निजी सब ट्री व्यू0_OLEStartDrag(ऑब्जेक्ट के रूप में डेटा, लंबे समय तक अनुमत प्रभाव) सेट मी , _ y एकल के रूप में, _ पूर्णांक के रूप में राज्य) MSComctlLib के रूप में मंद चयनित नोड। MSComctlLib के रूप में नोड मंद नोडओवर। यदि चयनित नहीं है तो नोड कुछ भी नहीं है तो चयनित नोड। चयनित =ट्रू एंड यदि अन्य अगर tv.HitTest(x, y) कुछ भी नहीं है तो 'कुछ और न करें' नोड को हाइलाइट करें माउस खत्म हो गया है सेट नोडओवर =टीवी। हिटटेस्ट (एक्स, वाई) सेट tv.Drophighlight =nodOver अंत अगर अंत है तो सब-प्राइवेट सब ट्री व्यू 0_OLEDragDrop (ऑब्जेक्ट के रूप में डेटा, _ लंबे समय तक प्रभाव, _ इंटीजर के रूप में बटन, _ इंटीजर के रूप में शिफ्ट, _ एक्स सिंगल के रूप में, _ वाई सिंगल के रूप में) मंद स्रोत नोड MSComctlLib के रूप में। लक्ष्य नोड MSComctlLib के रूप में। नोड मंद tmpRootNode MSComctlLib के रूप में। .नाम केस TreeView0.Name सेट सोर्सनोड =tv.SelectedItem End Select 'सोर्स पेरेंट नोड और टारगेट नोड रेफरेंस सेट करें SourceParentNode =sourceNode.Parent S et targetNode =tv.HitTest(x, y) 'यदि कोई त्रुटि है तो बाहर निकलें यदि त्रुटि <> 0 फिर MsgBox Err &":" और Err.Description, vbInformation + vbक्रिटिकल, "OLEDragDrop ()" Err.Clear Exit Sub Else On त्रुटि GoTo 0 End यदि 'लक्ष्य नोड कुंजी के साथ तुलना करने के लिए स्रोत पैरेंट नोड कुंजी प्राप्त करें/परिभाषित करें यदि SourceParentNode कुछ भी नहीं है तो strSPKey ="खाली" अन्यथा strSPKey =SourceParentNode.Key End यदि 'लक्ष्य नोड/स्थान की जांच करें और कुंजी चयन को परिभाषित करें केस ट्रू केस टारगेट नोड कुछ भी नहीं है strTargetKey ="खाली" केस targetNode.Key ="" strTargetKey ="खाली" लक्ष्य नोड सेट करें =कुछ भी मामला नहीं है strTargetKey =targetNode.Key End Select 'सुनिश्चित करें कि लक्ष्य नोड स्रोत नोड का अपना माता-पिता नहीं है। strTargetKey =strSPKey फिर उप से बाहर निकलें 'उपयोगकर्ता की नोड चाल कार्रवाई ट्रैक करें, त्रुटि की जांच करें। त्रुटि पर फिर से शुरू करें यदि लक्ष्य नोड कुछ भी नहीं है तो 'यदि लक्ष्य नोड कुछ भी नहीं है (खाली क्षेत्र में नोड गिरा दिया गया है), तो नोड को रूट-स्तर पर ले जाया जाना चाहिए' मूल स्रोत को बचाएं। कुंजी strtmpNodKey =sourceNode.Key ' स्रोत नोड कुंजी को संशोधित करें, कुछ पाठ के साथ, 'खाली' कहें, जैसे 'X5Empty' 'ताकि मूल स्रोत नोड कुंजी के साथ एक अस्थायी नोड बनाया जा सके। नोट:एक ही कुंजी वाले दो नोड एक ही समय में मेमोरी में नहीं रह सकते हैं। 'स्रोत नोड' कुंजी 'X5Empty' के साथ बाद में हटा दिया गया, 'अस्थायी नोड इसे गिरा दिया गया स्थान लेता है। sourceNode.Key =sourceNode.Key और strTargetKey 'मूल स्रोत नोड कुंजी सेट tmpRootNode =tv.Nodes के साथ अस्थायी रूट नोड बनाएं। जोड़ें (,, strtmpNodKey, sourceNode.Text) 'रूट नोड छवि अनुक्रमणिका को परिभाषित करें' tmpRootNode के साथ '। छवि =1 ' .SelectedImage =4 'के साथ समाप्त' SourceNode से सभी बच्चे नोड्स को स्थानांतरित करें, यदि कोई हो, 'जैसा कि tmpRootNode के बच्चे स्रोत नोड तक करते हैं। बच्चे =0 स्रोत नोड सेट करें। बच्चे। माता-पिता =tmpRootNode 'नोड छवि अनुक्रमणिका को संशोधित करें' स्रोत नोड के साथ '। छवि =2 ' .SelectedImage =3 'लूप के साथ समाप्त' TreeView tv.Nodes से संशोधित कुंजी के साथ स्रोत नोड हटाएं। sourceNode.Index 'TmpRootNode को मूल कुंजी के साथ ले जाएं' TreeView पर गिराए गए स्थान पर सेट करें स्रोत नोड =tmpRootNode Else ' स्रोत नोड को लक्ष्य नोड के तहत बच्चे के रूप में ले जाएं स्रोत नोड सेट करें। माता-पिता =लक्ष्य नोड 'नोड छवि अनुक्रमणिका को संशोधित करें' स्रोत नोड के साथ '। छवि =2'। चयनित छवि =3 'अंत के साथ अंत अगर' सूचित करें, अगर कोई त्रुटि थी तो बाहर निकलें, अन्यथा संबंधित रिकॉर्ड के प्रेंट आईडी को अपडेट करें। यदि त्रुटि <> 0 तो MsgBox Err &":" &"स्थानांतरित करने में असमर्थ:" और vbCrLf और Err.Description, vbInformation + vbक्रिटिकल, "DragDrop2 ()" उप से बाहर निकलें 'रिकॉर्ड को अपडेट करने के लिए SQL कथन बनाएं और निष्पादित करें यदि लक्ष्य नोड कुछ भी नहीं है तो intKey =Val(Mid(sourceNode.Key, 2)) strsQL ="अपडेट सैंपल सेट पेरेंटआईडी =नल" और _ "जहां आईडी =" और intKey Else intKey =Val(Mid(sourceNode.Key, 2)) intPKey =Val(Mid(targetNode.Key, 2)) strsQL ="अद्यतन नमूना सेट पेरेंटआईडी =" और intPKey &_ "जहां आईडी =" और intKey समाप्त होता है यदि 'तालिका रिकॉर्ड को संशोधित करें CurrentDb.Execute strsQL, dbFailOnError' यदि कोई त्रुटि है उठाया गया है तो ट्री व्यू रीफ्रेश करें और बाहर निकलें यदि त्रुटि <> 0 फिर MsgBox Err &":" और Err.Description LoadTreeView 'बिना किसी बदलाव के ट्री व्यू को रीफ्रेश/डिस्प्ले करें अन्यथा' क्रमबद्ध नोड्स यदि आप rceNode.Parent कुछ भी नहीं है तो sourceNode.Root.Sorted =True Else sourceNode.Parent.Sorted =True End if tv.Nodes(sourceNode.Key).Selected =True End If End If पर Error GoTo 0End SubPrivate Sub TreeView0_OLECompleteDrag (लंबे समय तक प्रभाव ) 'ड्रॉपहाइलाइट बंद करें टीवी सेट करें। 

ड्रैग-ड्रॉप एक्शन के लिए, चार सबरूटीन्स हैं, जब आप नोड को ड्रैग करते हैं तो वे स्वचालित रूप से निष्पादित हो जाते हैं, अन्य नोड्स पर ले जाने पर नोड को हाइलाइट करते हैं, और अंत में इसे एक अलग नोड पर या रूट-लेवल खाली क्षेत्र पर छोड़ देते हैं। ।

संहिता के मुख्य सबरूटीन्स।

  • ट्री व्यू0_OLEStartDrag() - चयनित आइटम को इनिशियलाइज़ करता है और नोड को कुछ भी नहीं पर सेट करता है
  • ट्री व्यू0_OLEDragOver() - माउस मूव इवेंट की तरह काम करता है, नोड को हाइलाइट करता है, जब एक नोड को उसके ऊपर ड्रैग करता है, लक्ष्य नोड के रास्ते पर।
  • ट्री व्यू0_OLEDragDrop() – जांच और नियंत्रण करता है, नोड को गिराए गए स्थान पर रखता है, और आधार तालिका पर रिकॉर्ड को अपडेट करता है।
  • ट्री व्यू0_OLECompleteDrag() - ड्रॉपहाइलाइट संपत्ति कुछ भी नहीं पर सेट है।

हम TreeView0_OLEDragDrop() . के साथ ड्रैग एंड ड्रॉप कार्य कर सकते हैं अकेले सबरूटीन। उस स्थिति में, कोई नोड-हाइलाइट नहीं होगा, जब स्रोत नोड अन्य नोड्स पर एक स्थान से दूसरे स्थान पर जाता है, सिवाय इसके कि माउस पॉइंटर अपने पीछे एक दूसरा तीर खींचने के लिए बदल जाता है, जैसे नीचे दी गई नमूना छवि में :

इसलिए, हम इस सबरूटीन पर ध्यान देंगे और शुरू से ही कोड की विस्तार से जांच करेंगे। सबरूटीन की शुरुआत में, हमने आवश्यक नोड्स और स्ट्रिंग वेरिएबल्स, और अन्य की घोषणा की है।

यहां पंक्ति-दर-पंक्ति विश्लेषण दोहराने के बजाय, मैंने कोड की प्रत्येक पंक्ति/अनुभाग पर उपयुक्त रूप से टिप्पणी की है ताकि आप समझ सकें कि जब आप कोड को पढ़ते हैं तो यह क्या करता है। आप उनके माध्यम से जा सकते हैं।

द सीक्वेंस ऑफ ड्रेप ड्रॉप इवेंट्स

आइए हम ईवेंट के क्रम को समझें, उपयोगकर्ता चयन करता है एक नोड, अपने अंतिम गंतव्य के रास्ते में अन्य नोड्स पर ड्रैग करता है, और ड्रॉप्स यह लक्ष्य Node. या इसे ट्री व्यू कंट्रोल पर खाली क्षेत्र पर छोड़ दें, ताकि इसे रूट-लेवल Node.

जब आप किसी नोड को दूसरे नोड-टेक्स्ट पर खींचते हैं तो नोड-टेक्स्ट हाइलाइट हो जाता है, यह कहते हुए कि आपकी वर्तमान स्थिति इस नोड पर है, जहां भी आप यहां से जा रहे हैं। जब नोड-पाठ से बाहर ले जाया जाता है तो हाइलाइट गायब हो जाता है। यह सब लक्ष्य नोड के माध्यम से होता है। TreeView0_OLEDragOver() सबरूटीन इस हाइलाइटिंग क्रिया का ध्यान रखता है।

जब आप किसी नोड को कहीं छोड़ते हैं TreeView0_OLEDragDrop() सबरूटीन अधिभार लेता है। यहां, हमें उपयोगकर्ता के इरादों का विश्लेषण करना होगा और उचित कार्रवाई करनी होगी। नोड को सही स्थान पर ले जाने के लिए निम्नलिखित जानकारी को सहेजा और विश्लेषण किया जाना चाहिए।

इस पर नज़र रखने के लिए महत्वपूर्ण जानकारी।

  1. स्रोत नोड संदर्भ, नोड कुंजी और अभिभावक आईडी मान, नोड बच्चे, यदि कोई हो।

  2. लक्ष्य नोड या स्थान संदर्भ, नोड कुंजी।

  3. यदि लक्ष्य एक नोड नहीं बल्कि ट्री व्यू कंट्रोल का खाली क्षेत्र है, तो स्रोत नोड को रूट-लेवल स्थिति में ले जाया जाएगा।

  4. स्रोत नोड जब दूसरे नोड पर गिराया जाता है, तो लक्ष्य नोड स्रोत नोड का नया जनक बन जाता है।

  5. यदि स्रोत नोड के अपने बच्चे हैं तो उन्हें भी अपने माता-पिता के साथ स्थानांतरित किया जाना चाहिए।

  6. ** जब नोड को खींचकर उसके अपने पैरेंट-नोड पर छोड़ दिया जाता है तो इस क्रिया को अनदेखा करें।

    ** उदाहरण के लिए, उपरोक्त छवि की जाँच करें। अगर हम टेक्स्टबॉक्स . को खींचते हैं नोड करें और इसे इसके पैरेंट-नोड पर छोड़ दें नियंत्रण, या नियंत्रणों . को खींचता है नोड करें और इसे इसके मूल नोड फ़ॉर्म . पर छोड़ दें तो उन चालों को नज़रअंदाज़ कर दिया जाएगा।

  7. ** अगर रूट-लेवल नोड को खींचकर खाली क्षेत्र में गिरा दिया जाता है, फिर कोई कार्रवाई नहीं की जाएगी क्योंकि यह पहले से ही रूट-स्तरीय नोड है।

नोड की सभी मान्य चालों के लिए, हमें ParentID . को अपडेट करना होगा नमूना . पर संबंधित रिकॉर्ड का फ़ील्ड मान टेबल.

रूट-लेवल खाली क्षेत्र में नोड ड्रॉप।

आइटम नंबर के मामले में 3 ऊपर, हमें स्रोत नोड की समान आईडी संख्या के साथ एक रूट स्तर नोड बनाना होगा, जिसकी अनुमति नहीं है। ट्री व्यू पदानुक्रम में डुप्लीकेट कुंजी मान की अनुमति नहीं है। संहिता का यही एकमात्र क्षेत्र है, जहां आप वहां अपनाई जाने वाली प्रक्रिया के बारे में थोड़ा भ्रमित पाएंगे।

प्रक्रिया नीचे दी गई है:

  1. कुछ अतिरिक्त टेक्स्ट जोड़कर मौजूदा ट्री व्यू नोड कुंजी को संशोधित करें, (जैसे कुंजी X5 बदलें करने के लिए X5खाली ), मूल कुंजी के साथ एक अस्थायी नोड बनाते समय मुख्य संघर्षों से बचने के लिए।

  2. एक अस्थायी बनाएं मूल कुंजी वाला नोड:X5.

  3. स्रोत नोड से सभी चिल्ड्रन नोड्स को, यदि कोई हो, चाइल्ड नोड्स के रूप में अस्थायी नोड में स्थानांतरित करें।

  4. संशोधित कुंजी के साथ TreeView स्रोत नोड हटाएं:X5खाली ट्री व्यू कंट्रोल से, लेकिन नमूना तालिका पर संबंधित रिकॉर्ड को छुआ नहीं गया है।

  5. अस्थायी को स्थानांतरित करें मूल कुंजी के साथ नोड X5 अपने बच्चों के साथ ट्री व्यू कंट्रोल की रूट-स्तरीय स्थिति में।

  6. संबंधित रिकॉर्ड के पेरेंटआईडी फ़ील्ड को शून्य-लंबाई वाले स्ट्रिंग ("") से अपडेट करें ताकि इसे रूट-लेवल नोड के रूप में चिह्नित किया जा सके।

ड्रैग ड्रॉप के स्वयं प्रयोग।

आप स्वयं कुछ ड्रैग एंड ड्रॉप प्रयोग करके देख सकते हैं कि यह कैसे काम करता है। एक नोड का चयन करें, बाएं माउस बटन को क्लिक करके रखें, नोड को खींचें, और इसे दूसरे नोड पर छोड़ दें, या इसे ट्री व्यू कंट्रोल के खाली क्षेत्र में छोड़ दें। जब आप नोड को अन्य नोड-पाठ पर खींचते हैं तो यह हाइलाइट हो जाता है और जब आप नोड से बाहर होते हैं तो हाइलाइट निकल जाता है। घसीटा हुआ नोड उस नए स्थान पर दिखाई देगा जहां आपने उसे छोड़ा है। आप बच्चों के साथ एकल नोड या नोड का चयन करके इस ड्रैग-ड्रॉप प्रयोग को दोहरा सकते हैं।

नोड्स के इस आंदोलन के आधार पर संबंधित रिकॉर्ड के ParentID फ़ील्ड मान कुंजी . के साथ अपडेट किया जाएगा लक्ष्य नोड संबंधित रिकॉर्ड का मान (आईडी)।

टू-स्टेप नोड पॉप्युलेटिंग प्रक्रिया क्यों?

अब, हम LoadTreeView() . पर वापस जाएंगे सबरूटीन, ट्री व्यू कंट्रोल में सभी नोड्स को पॉप्युलेट करने के लिए अपनाई गई दो-चरणीय प्रक्रिया पर फिर से नज़र डालने के लिए।

  • नमूना . में सभी रिकॉर्ड तालिका को प्रारंभ में रूट-स्तरीय नोड्स के रूप में जोड़ा जाता है, आईडी फ़ील्ड मान को नोड-कुंजी के रूप में उपयोग करते हुए।

  • अभिलेखों के दूसरे पास में, यदि पेरेंटआईडी फ़ील्ड मान खाली है तो वह नोड बिना परिवर्तन के रूट-स्तरीय नोड के रूप में रहेगा।

  • अन्य सभी नोड-संबंधित रिकॉर्ड माता-पिता के मान के साथ सही ढंग से इसके मूल नोड के अंतर्गत ले जाया जाता है।

स्वाभाविक रूप से, यह प्रश्न उठता है कि हमें इसे इस तरह क्यों करना है?

हम उत्तर को बहुत अधिक शब्दों में बताए बिना स्पष्ट करने के लिए एक सरल प्रयोग करेंगे। हो सकता है कि आपने पहले ही ड्रैग एंड ड्रॉप ट्रायल रन के कुछ ट्रायल रन खुद किए हों और नोड्स को पुनर्व्यवस्थित किया हो, इस प्रक्रिया में परिवर्तन के साथ उन रिकॉर्ड के पेरेंटआईडी मानों को अपडेट किया गया। इसलिए, हमें नमूना . में रिकॉर्ड मानों को उनकी मूल स्थिति में रीसेट करने की आवश्यकता है टेबल, इससे पहले कि हम एक नया डेमो शुरू करें।

हमने अपनी तालिका नमूना . की एक प्रति पहले ही बना ली है पहले, Sample_bk . नाम से बैकअप के रूप में. नमूना हटाएं तालिका बनाएं और नमूना_बीके . से एक प्रति बनाएं मूल नाम के साथ:नमूना .

तालिका खोलें और रिकॉर्ड और उनके पेरेंटआईडी फ़ील्ड मान देखें। तालिका का नमूना चित्र नीचे दिया गया है:

आईडी फ़ील्ड मान ऑटोनंबर हैं और वे सभी अनुक्रमिक क्रम में हैं और सभी आईडी मान अद्वितीय हैं। निम्नलिखित सरल नियम ट्री व्यू कंट्रोल में चाइल्ड नोड को जोड़ने को नियंत्रित करता है।

सरल चाइल्ड नोड नियम: अभिभावक आईडी फ़ील्ड मान (अभिभावक-कुंजी ) एक रिकॉर्ड में उम्मीद करता है कि ट्री व्यू कंट्रोल में एक पेरेंट नोड पहले से मौजूद है, जिसका मान नोड-कुंजी के समान है। (आईडी).

ऊपर दी गई तालिका छवि में, ऊपर से तीसरा रिकॉर्ड देखें। पेरेंटआईडी फ़ील्ड मान 2 है और वर्तमान रिकॉर्ड की आईडी 3 है। इस मामले में, आईडी 2 के साथ रिकॉर्ड को ट्री व्यू कंट्रोल में जोड़ा जाएगा, इससे पहले कि हम नोड में तीसरा रिकॉर्ड जोड़ने का प्रयास करें। जरूरी नहीं कि दोनों रिकॉर्ड एक दूसरे के बगल में हों। आईडी नंबर 21 के साथ रिकॉर्ड की जांच करें, इसका पेरेंटआईडी फ़ील्ड मान 12 है, जो वर्तमान रिकॉर्ड आईडी मान 21 से कम है।

किसी भी मामले में, जब प्रोग्राम को रिकॉर्ड में पेरेंटआईडी मान का सामना करना पड़ता है, तो यह मानता है कि पेरेंटआईडी के बराबर आईडी मान वाला रिकॉर्ड पहले से ही नोड्स को पॉप्युलेट करने के पहले चक्र में ट्री व्यू कंट्रोल में नोड के रूप में जोड़ा गया था।

दो चरणों की प्रक्रिया को सही ठहराना।

आइए कुछ ड्रैग-ड्रॉप ट्रायल रन का प्रयास करें। लेकिन, इससे पहले, हमारे पास frmSample, . नाम का एक फॉर्म है जो हमने पहले ट्यूटोरियल सत्र में उपयोग किया है, और उसमें हमने सभी ट्री व्यू नोड्स को एक बार में लोड कर दिया है। हां, हमने अब तक यही तरीका अपनाया है और हमें अभी से कुछ बदलाव की जरूरत है। लेकिन, इससे पहले आइए पुराने फॉर्म को खोलें और देखें कि फॉर्म पर नोड्स कैसे दिखाई देते हैं।

  1. प्रपत्र खोलें frmनमूना यह देखने के लिए कि पुराने नियम का उपयोग करके लोड किए गए नमूना तालिका रिकॉर्ड के साथ, ट्री व्यू डिस्प्ले कैसा दिखता है।

  2. यदि आप ट्री व्यू नोड्स देख रहे हैं तो फॉर्म को बंद कर दें।

  3. अब, frmDragDrop खोलें रूप। हम एक नोड को खींचने और छोड़ने की तैयारी कर रहे हैं।

  4. नोड-पाठ के साथ नोड का चयन करें तालिका, माउस के बाएँ बटन को क्लिक करके रखें, इसे नोड-पाठ फ़ॉर्म के साथ नोड पर खींचें और छोड़ें।

  5. तालिका अपने तत्काल चाइल्ड-नोड के साथ नोड फ़ील्ड और इसके चिल्ड्रन नोड्स को फ़ॉर्म . के अंतर्गत चाइल्ड नोड के रूप में स्थानांतरित किया जाता है नोड.

  6. फ़ॉर्म को बंद करें frmDragDrop और इसे फिर से खोलें। नीचे दी गई छवि की तरह, नोड्स सही ढंग से दिखाई देंगे, जहां आपने उन्हें छोड़ा है।

  7. अब, फॉर्म frmDragDrop को बंद करें।

  8. प्रपत्र खोलें frmनमूना यह देखने के लिए कि यह परिवर्तन इस प्रपत्र पर कैसे दिखाई देता है। आपको एक त्रुटि संदेश के साथ बधाई दी जाएगी, तत्व नहीं मिला त्रुटि संख्या:35601. . के साथ

  9. हाइलाइट की गई कोड लाइन पर जाने के लिए डीबग कमांड बटन का चयन करें, जहां त्रुटि हुई।

  10. माउस को नोडकी . पर रखें Add() विधि का परम, यह X3, . दिखाता है बिंदु ParentKey . पर माउस पैरामीटर और यह X7 दिखाता है।

    इन दो पैरामीटर मानों को देखते हुए, हम मान सकते हैं कि हम आईडी मान 3 के साथ रिकॉर्ड पर हैं और इस नोड को एक चाइल्ड नोड के रूप में नामित करने का प्रयास कर रहे हैं, एक अन्य नोड के लिए जो अभी तक ट्री व्यू कंट्रोल में नहीं है, आईडी मान 7 के साथ।

  11. F5 दबाएं फिर से वही डायलॉग बॉक्स लाने की कुंजी और समाप्त . पर क्लिक करें प्रोग्राम को रोकने और डेटाबेस विंडो पर फॉर्म लाने के लिए कमांड बटन। FrmSample फ़ॉर्म को बंद करें।

  12. नमूनाखोलें हमारे ड्रैग एंड ड्रॉप एक्शन के बाद, पेरेंटआईडी नंबरों की व्यवस्था देखने के लिए तालिका। रिकॉर्ड नीचे दी गई छवि की तरह दिखाई देंगे और मैंने उस रिकॉर्ड को हाइलाइट किया है जिसने पेरेंटआईडी मान के साथ त्रुटि को ट्रिगर किया 7 और अपनी मूल रिकॉर्ड स्थिति दिखा रहा है

पहले की नोड पॉप्युलेटिंग सामान्य प्रक्रिया के बाद, हम तीसरे रिकॉर्ड स्थान पर हैं। चूंकि, माता-पिता का मान 7 रिकॉर्ड करता है, आईडी मान के साथ नोड 7 ट्री व्यू कंट्रोल में मौजूद होना चाहिए। आईडी मान वाला नोड 7 अभी तक ट्री व्यू कंट्रोल में पॉप्युलेट नहीं हुआ है, लेकिन हम गैर-मौजूद नोड को संदर्भित करने का प्रयास कर रहे हैं और यह एक त्रुटि को ट्रिगर करता है।

यहां तक ​​कि अगर आप अभिलेखों को पेरेंटआईडी फ़ील्ड क्रम में क्रमबद्ध करते हैं तो रिकॉर्ड नई व्यवस्था नीचे दी गई छवि की तरह दिखाई देगी:

अब, एक और रिकॉर्ड का पेरेंट नोड अपेक्षित स्थिति में नहीं है।

इसलिए, इन परिस्थितियों में, हमारा दो-चरण ट्री व्यू नोड्स लोडिंग दृष्टिकोण सामान्य और ड्रैग-ड्रॉप दोनों क्रियाओं के लिए भी काम करता है।

पहले चरण में सभी रिकॉर्ड्स को ट्री व्यू कंट्रोल में रूट-लेवल नोड्स के रूप में आईडी फ़ील्ड मान का उपयोग नोड-कुंजी के रूप में पॉप्युलेट करें।

अब, सभी रिकॉर्ड के सभी नोड ट्री व्यू कंट्रोल में उपलब्ध हैं। हम जहां चाहें उन्हें इधर-उधर ले जाना आसान होगा। यह नहीं कहता है कि ट्री व्यू में कोई भी आवश्यक नोड मौजूद नहीं है।

In the second pass on the same set of records, the records with empty ParentID field values are untouched and allowed to remain as Root-level Nodes. In other cases moves the Node as Child-Node under its Parent Node, by updating the [Relative] Parameter of the Node with the following Statement:

Set tv.Nodes.Item(strKey).Parent =tv.Nodes.Item(strPKey)

This is what we do through the second pass on the same set of records. You may do it by resetting the Record Pointer to the first record, by executing rst.MoveFirst before the Do . . . Loop, EOF conditions and rst.MoveNext to access each record as we normally do.

Second Step in Reverse Order.

Or you may do it in reverse order. After populating all records as Root-level Nodes the Record Pointer will be beyond the last record and on the EOF position. You may reset the record pointer to the last record, by executing rst.MoveLast before the Do . . . Loop BOF check, and execute rst.MovePrevious to access each record and move the Nodes correctly under its p arent Node. But, the Nodes may load slightly differently in the placement order of Nodes.

You may try this out yourself with the above-suggested change of Code and see the result.

Download Demo Database


  1. एमएस-एक्सेस क्लास मॉड्यूल और वीबीए
  2. एमएस-एक्सेस वीबीए क्लास ऑब्जेक्ट एरेज़
  3. एमएस-एक्सेस बेस क्लास और व्युत्पन्न ऑब्जेक्ट
  4. VBA Base Class and Derived Object-2
  5. आधार वर्ग और व्युत्पन्न वस्तु प्रकार
  6. MS-Access Recordset and Class Module
  7. एक्सेस क्लास मॉड्यूल और रैपर क्लासेस
  8. आवरण वर्ग कार्यक्षमता परिवर्तन


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एमएस एक्सेस के लिए एड-हॉक कनेक्शन स्ट्रिंग्स और विषम प्रश्न

  2. इन 3 सामान्य एक्सेस समस्याओं का निवारण कैसे करें

  3. माइक्रोसॉफ्ट एक्सेस में इन्वेंटरी डेटाबेस कैसे बनाएं

  4. बॉयलरप्लेट के सुंदर ब्लॉक

  5. एक्सेस 2016 में ऑब्जेक्ट निर्भरता कैसे प्रदर्शित करें