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

ट्री व्यू कंट्रोल चेक-मार्क ऐड डिलीट नोड्स

परिचय।

ट्री व्यू कंट्रोल ट्यूटोरियल के इस एपिसोड में, हम सीखेंगे कि कैसे जोड़ें/हटाएं नोड्स। उम्मीदवार आइटम जोड़ें/हटाएं की स्थिति चेक-चिह्नित होगी, जहां हम जोड़ें () चाहते हैं नया नोड या निकालें () चिह्नित नोड. नोड का जोड़ चिह्नित नोड या चाइल्ड नोड के समान स्तर पर हो सकता है।

ट्री व्यू नियंत्रण ट्यूटोरियल सत्र अब तक।

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

अन्य नियंत्रणों के साथ एमएस-एक्सेस फॉर्म पर डेमो ट्री व्यू कंट्रोल का सामान्य दृश्य नीचे दिया गया है।

ट्री व्यू कंट्रोल के डेमो के लिए डेटा टेबल।

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

आईडी स्तंभ (वृक्ष दृश्य कुंजी ) एक AutoNumber फ़ील्ड है।

नए विज़िटर इस ट्यूटोरियल सत्र के लिए अपडेट प्राप्त करें।

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

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

इमेज लिस्ट कंट्रोल को इमेज के साथ इम्पोर्ट करना।

आप किसी अन्य डेटाबेस में अपलोड की गई छवियों के साथ, आपके पास पहले से मौजूद इमेजलिस्ट कंट्रोल को निम्नलिखित तरीकों से ला सकते हैं:

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

  2. या, इमेजलिस्ट कंट्रोल को क्लिपबोर्ड में कॉपी करें, डेटाबेस से, जहां आपके पास यह है, पहले। यदि आपने पिछले ट्यूटोरियल सत्र से डेमो डेटाबेस डाउनलोड किया है तो आपके पास पहले से ही अपलोड की गई छवियों के साथ इमेजलिस्ट कंट्रोल है। ImageList नियंत्रण को क्लिपबोर्ड पर कॉपी करने के बाद डेटाबेस को बंद करें।

  3. लक्ष्य डेटाबेस खोलें और उस प्रपत्र को खोलें जहाँ आप ImageList नियंत्रण चाहते हैं और उसे प्रपत्र पर चिपकाएँ।

    CreateTreeView() . में निम्नलिखित कोड पंक्तियों के साथ सब-रूटीन आप इमेजलिस्ट ऑब्जेक्ट रेफरेंस को ट्री व्यू कंट्रोल में पास कर सकते हैं।

    Dim tv As MSComctlLib.TreeView
    Dim ImgList As MSComctlLib.ImageList
    
    Set tv = Me.TreeView0.Object
    tv.Nodes.Clear
    
    Set ImgList = Me.ImageList0.Object
    tv.ImageList = ImgList 

कोड में हाइलाइट किए गए ऑब्जेक्ट नाम बदलें, यदि वे प्रपत्र पर भिन्न हैं।

उसके बाद, आप छवि कुंजी नामों को TreeView Nodes.Add() . में जोड़ सकते हैं विधि के अंतिम दो पैरामीटर।

ये अभ्यास हम पहले के सत्रों में कर चुके हैं। आपको याद दिलाने के लिए हम टेबल और ट्री व्यू कंट्रोल का उपयोग कर रहे हैं जिसे हमने पहले ट्यूटोरियल सत्र में बनाया है और ऊपर बताए गए परिवर्तनों के साथ लागू किया गया है।

चेक-चिह्नित नोड्स संपत्ति मान प्रदर्शित करना।

चयनित नोड कुंजी , अभिभावक कुंजी, और पाठ ट्री व्यू कंट्रोल के दाईं ओर टेक्स्टबॉक्स में गुण प्रदर्शित होते हैं। चेक-बॉक्स कैप्शन के साथ:चाइल्ड नोड, हटाएं नोड, और नोड जोड़ें कमांड बटन फॉर्म में नए जोड़ हैं। उनके कार्यों को थोड़ी देर में समझाया जाएगा।

ट्री व्यू कंट्रोल पर चेकबॉक्स प्रदर्शित करना।

आम तौर पर, चेक-बॉक्स ट्री व्यू कंट्रोल पर प्रदर्शित नहीं होता है, जब तक कि हम ट्री व्यू कंट्रोल की प्रॉपर्टी शीट में किसी प्रॉपर्टी को सक्षम नहीं करते हैं। यहां इसकी कुछ सीमित कार्यक्षमता है। हम यहां जो कुछ भी करने जा रहे हैं वह बिना चेक-बॉक्स के भी किया जा सकता है।

चेकबॉक्स के उपयोग के लिए एक बेहतर तरीका हो सकता है, एक्सेस प्रोजेक्ट मेनू से शाखाओं के उपयोगकर्ता-चयन योग्य यादृच्छिक विकल्पों के आधार पर, कंपनी के व्यवसायों के चयनित शाखा स्थानों पर एक रिपोर्ट तैयार करना।

यहाँ, उद्देश्य इस सुविधा के बारे में जागरूकता देना और इसके उपयोग पर एक डेमो चलाना है।

  1. डिज़ाइन व्यू में ट्री व्यू कंट्रोल के साथ फॉर्म खोलें।
  2. ट्री व्यू कंट्रोल पर राइट-क्लिक करें, TreeCtrl ऑब्जेक्ट को हाइलाइट करें , गुण . चुनें संपत्ति पत्रक प्रदर्शित करने का विकल्प।
  3. चेक-मार्क को चेकबॉक्स पर लगाएं गुण नियंत्रण पर विकल्प जैसा कि नीचे दी गई छवि में दिखाया गया है।

सबसे ऊपर दी गई डेमो ट्री व्यू इमेज, विवरण।

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

दाईं ओर तीन टेक्स्टबॉक्स हैं, शीर्षक के नीचे लेबल:संपत्ति मान , चेक-चिह्नित नोड की कुंजी . प्रदर्शित करने के लिए , पेरेंटकी, और पाठ मान।

नोड हटाएं कमांड बटन चेक-चिह्नित नोड या नोड और उसके चाइल्ड नोड्स को हटा देता है।

नोड कमांड बटन जोड़ें का चयन करने से पहले , पाठ नए नोड के लिए नए टेक्स्ट मान के साथ बदलने के लिए संपत्ति मूल्य को संपादित किया जाना चाहिए।

नोड जोड़ें के ऊपर कमांड बटन, एक चेक बॉक्स है लेबल के साथ चाइल्ड Node. नोड जोड़ें और चाइल्ड नोड नया नोड कहां दिखाई देना चाहिए, इस बारे में नियम सेट करने के लिए चेक-बॉक्स एक साथ काम करते हैं।

नोड जोड़ें क्रिया को समझना।

मान लें कि आप हाइपरलिंक . के लिए एक नया नोड जोड़ना चाहते हैं फ़ील्ड . के अंतर्गत फ़ील्ड समूह (या पैरेंट नोड) डेटा प्रकार सूची। इस पृष्ठ के शीर्ष पर दी गई डेमो छवि को देखें, जहां मैंने दिनांक फ़ील्ड को चेक-चिह्नित किया है Node, अन्य चाइल्ड-नोड्स के बीच। दाईं ओर संपत्ति पत्रक इसकी कुंजी दिखाते हैं:X15 , पेरेंटकी:X4 और टेक्स्ट:दिनांक फ़ील्ड विवरण।

टेक्स्ट बदलें:दिनांक फ़ील्ड करने के लिए हाइपरलिंक संपत्ति प्रदर्शन टेक्स्ट बॉक्स पर और नोड जोड़ें . पर क्लिक करें कमांड बटन। आउटपुट नीचे दिखाया जाएगा:

यदि आप फ़ील्ड . को चेक-मार्क करते हैं पैरेंट नोड आइटम और चाइल्ड-नोड . में चेक-मार्क लगाएं विकल्प, नोड जोड़ें . के ऊपर कमांड बटन, आपको वही परिणाम मिलेगा।

इसके बजाय, यदि आप दिनांक फ़ील्ड . पर नोड चेक-चिह्न रखते हैं और चाइल्ड-नोड . पर चेक-चिह्न सेट करें नोड जोड़ें . के ऊपर विकल्प कमांड बटन, जैसा कि नीचे दिखाया गया है, आपको परिणाम मिलेगा।

चाइल्ड नोड चेक-चिह्नित नोड के तहत बनाया जाएगा।

नोड जोड़ें क्रियाओं को पहले अंतर्निहित तालिका में एक नया रिकॉर्ड बनाने की आवश्यकता होती है।

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

ऐड नोड सब-रूटीन वीबीए कोड नीचे दिया गया है:

Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = 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 setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub
बनाएं।

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

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

चेक किए गए नोड के गुण मान प्रपत्र नियंत्रणों से strKey . में पढ़े जाते हैं , strParentKey, और strText. आईडी, पेरेंटआईडी संख्यात्मक मान निकाले जाते हैं और lngKey . में सहेजे जाते हैं और lngParentKey SQL स्ट्रिंग में उपयोग के लिए चर।

इसके बाद, चाइल्ड-नोड चेक-बॉक्स मान ChildFlag . में सहेजा गया है चर।

चयनित नोड और चाइल्ड-नोड के आधार पर SQL स्ट्रिंग्स के तीन अलग-अलग सेट बनाए जाते हैं नोड कमांड जोड़ें बटन के ऊपर चेक बॉक्स विकल्प।

  1. यदि अभिभावक आईडी प्रपत्र पर संपत्ति का मूल्य खाली है और चाइल्ड नोड चेक-बॉक्स चेक नहीं किया गया है तो रूट-लेवल नया रिकॉर्ड बनाया जाएगा क्योंकि उपयोगकर्ता ने रूट-लेवल नोड को चेक-मार्क किया है।
  2. यदि अभिभावक आईडी संपत्ति का मूल्य>=0 और चाइल्ड नोड चेक-बॉक्स चयनित है (चेक किया गया ) फिर चेक-चिह्नित नोड के लिए चाइल्ड-नोड के रूप में एक नया रिकॉर्ड बनाया जाता है। चेक-चिह्नित नोड की कुंजी (आईडी) नए नोड के लिए नए रिकॉर्ड पर पेरेंटआईडी के रूप में प्रयोग किया जाता है।
  3. यदि अभिभावक आईडी मान >=0 और चाइल्ड नोड चेक-बॉक्स विकल्प नहीं चुना गया (चेक नहीं किया गया ) फिर नए नोड के लिए नया रिकॉर्ड बनाया जाता है, उसी स्तर पर जिस स्तर पर चेक-चिह्नित नोड होता है।

इंटफ्लैग वेरिएबल को तीन मानों में से एक के साथ सेट किया गया है:1,2 या 3, SQL के निष्पादन के आधार पर, ट्री व्यू कंट्रोल पर बनाने के लिए नोड के प्रकार के संकेत के रूप में।

अगला, विकल्पों के चयन के आधार पर SQL को नमूना . पर नया रिकॉर्ड बनाने के लिए निष्पादित किया जाता है तालिका, एक नए AutoNumber ID फ़ील्ड मान के साथ।

इसके बाद, DMax() फ़ंक्शन नए नोड के लिए विशिष्ट रिकॉर्ड आईडी को कुंजी-मान के रूप में लौटाता है।

नोड प्रकार विकल्प (1,2 या 3) के आधार पर नोड ट्री व्यू कंट्रोल पर बनाया जाता है।

संपत्ति प्रदर्शन टेक्स्ट बॉक्स सामग्री साफ़ कर दी गई है।


बच्चों के साथ नोड या नोड हटाना।

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

नोड हटाने के लिए VBA कोड नीचे दिया गया है:

Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If 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
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End 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
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

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

यदि केवल एक आइटम चेक-चिह्नित है तो दूसरा चरण सत्यापन जांच चयनित नोड के चाइल्ड नोड की उपस्थिति की तलाश करता है। यदि चाइल्ड नोड पाए जाते हैं, तो उस प्रभाव पर एक संदेश प्रदर्शित होता है। उपयोगकर्ता को पहले बच्चे के नोड्स और फिर चेक-चिह्नित पैरेंट नोड को हटाने के लिए आगे बढ़ने के अपने इरादे की पुन:पुष्टि करने की आवश्यकता है।

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

चाइल्ड नोड्स को एक-एक करके हटा दिया जाता है और टेबल पर संबंधित रिकॉर्ड भी एक के बाद एक हटा दिए जाते हैं। फिर चिह्नित पेरेंट रिकॉर्ड को हटा देता है।

यदि चिह्नित नोड में कोई चाइल्ड नोड नहीं है तो इसे सत्यापन जांच के तुरंत बाद हटा दिया जाता है और संबंधित तालिका रिकॉर्ड भी हटा दिया जाता है।

प्रपत्र पर संपत्ति प्रदर्शन टेक्स्ट बॉक्स सामग्री साफ़ कर दी गई है।


फॉर्म frmSample's Complete Class मॉड्यूल VBA कोड।

frmSample में संपूर्ण VBA कोड निम्नलिखित है:का क्लास मॉड्यूल, ढहने वाले नोड्स के विस्तार के लिए अन्य छोटे उप-रूटीन के साथ, TreeView0_NodeCheck घटना प्रक्रिया, cmdExit कमांड बटन क्लिक इवेंट, फॉर्म_लोड () प्रक्रियाएं, और CreateTreeView() सबरूटीन:

Option Compare Database
Option Explicit

Dim tv As MSComctlLib.TreeView
Dim ImgList As MSComctlLib.ImageList
Const KeyPrfx As String = "X"

Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = 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 setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If 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
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End 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
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

Private Sub cmdExpand_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = True
        Next

End Sub

Private Sub cmdCollapse_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = False
        Next
End Sub

Private Sub Form_Load()
    CreateTreeView
    cmdExpand_Click
End Sub

Private Sub CreateTreeView()
Dim db As Database
Dim rst As Recordset
Dim nodKey As String
Dim ParentKey As String
Dim strText As String
Dim strSql As String

Set tv = Me.TreeView0.Object
tv.Nodes.Clear

'Pass ImageList control reference to TreeView's ImageList Property.
Set ImgList = Me.ImageList0.Object
tv.ImageList = ImgList

strSql = "SELECT ID, Desc, ParentID FROM Sample;"

Set db = CurrentDb
Set rst = db.OpenRecordset("sample", dbOpenTable)
Do While Not rst.EOF And Not rst.BOF
    If Nz(rst!ParentID, "") = "" Then
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add , , nodKey, strText, "folder_close", "folder_open"
    Else
        ParentKey = KeyPrfx & CStr(rst!ParentID)
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add ParentKey, tvwChild, nodKey, strText, "left_arrow", "right_arrow"
    End If
rst.MoveNext
Loop

rst.Close
On Error GoTo 0
Set rst = Nothing
Set db = Nothing

End Sub

Private Sub TreeView0_NodeCheck(ByVal Node As Object)
Dim xnode As MSComctlLib.Node

Set xnode = Node
  If xnode.Checked Then
    xnode.Selected = True

    With Me
        .TxtKey = xnode.Key
      If xnode.Text = xnode.FullPath Then
        .TxtParent = ""
      Else
        .TxtParent = xnode.Parent.Key
      End If
        .Text = xnode.Text
    End With
  Else
    xnode.Selected = False
    With Me
      .TxtKey = ""
      .TxtParent = ""
      .Text = ""
    End With
End If
End Sub

FrmSample प्रपत्र का डिज़ाइन दृश्य नीचे दिया गया है:

आपकी टिप्पणियों, टिप्पणियों, सुझावों का स्वागत है।

डेमो डेटाबेस डाउनलोड के लिए संलग्न है।


शब्दकोश वस्तु

  1. शब्दकोश मूल बातें
  2. डिक्शनरी ऑब्जेक्ट बेसिक्स-2
  3. शब्दकोश ऑब्जेक्ट की और आइटम को सॉर्ट करना
  4. डिक्शनरी से रिकॉर्ड प्रदर्शित करें
  5. क्लास ऑब्जेक्ट्स को डिक्शनरी आइटम के रूप में जोड़ें
  6. क्लास ऑब्जेक्ट डिक्शनरी आइटम अपडेट करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SAP Lumira को Microsoft Access से कनेक्ट करना

  2. माइक्रोसॉफ्ट एक्सेस में अनुप्रयोगों के लिए विजुअल बेसिक

  3. वैकल्पिक निर्भरता बनाना

  4. 5 नौकरियां जिनके लिए माइक्रोसॉफ्ट एक्सेस की आवश्यकता है

  5. फॉर्म विजार्ड के साथ फॉर्म कैसे बनाएं