सूची दृश्य नियंत्रण में डेटा की पंक्तियों को पुनर्व्यवस्थित करना।
इस ट्यूटोरियल की पिछली कड़ी में, हमने सीखा कि इस सुविधा को सक्षम करके कॉलम को कैसे पुनर्व्यवस्थित किया जाए:AllowColumnReorder संपत्ति पत्रक पर विकल्प। लेकिन, एक पंक्ति को दूसरी पंक्ति में खींचकर और रखकर स्थानांतरित किया जाता है। ListView नियंत्रण पंक्तियों को पुनर्व्यवस्थित करने के लिए, ListItem ड्रैग एंड ड्रॉप क्रिया को इस सुविधा को प्रॉपर्टी शीट पर सक्षम करने की आवश्यकता होती है। लेकिन यह अकेले काम नहीं करेगा, आइटम को उसके आवश्यक क्रम में पुनर्व्यवस्थित करने के लिए VBA कोड की आवश्यकता है।
आइए इस अभ्यास के लिए हमारे डेटाबेस में नियंत्रण और वीबीए कोड के साथ एक नमूना एक्सेस फॉर्म बनाएं। ListBox और ListView नियंत्रणों के साथ प्रपत्र की नमूना छवि नीचे दी गई है।
हमने लिस्ट बॉक्स में टेबल्स और क्वेरीज़ (एक्शन क्वेरीज़ नहीं) की एक सूची बनाई है। सूची आइटम में से किसी एक का चयन करने से सूची दृश्य नियंत्रण पर रिकॉर्ड तुरंत प्रदर्शित होंगे, जैसा कि हम उन्हें डेटाशीट दृश्य में देखते हैं।
डिज़ाइन टास्क।
-
DataList . फ़ील्ड नाम के साथ एकल टेक्स्ट फ़ील्ड के साथ एक नई तालिका बनाएं ।
-
तालिका को lvTables . नाम से सहेजें (lv का मतलब लिस्ट व्यू है)।
-
डेटाशीट व्यू में टेबल खोलें।
-
कुछ तालिका नाम जोड़ें और तालिका में अपने डेटाबेस से क्वेरी नामों का चयन करें। मैंने अपनी सूची के लिए नॉर्थविंड नमूना डेटाबेस से तालिकाएँ आयात की हैं।
नोट: द अनुलग्नक सूची दृश्य नियंत्रण में फ़ील्ड मान्य नहीं है। अटैचमेंट फ़ील्ड वाली टेबल के लिए सेलेक्ट क्वेरीज़ बनाएँ और अटैचमेंट फ़ील्ड को छोड़कर सभी फ़ील्ड चुनें।
-
डिज़ाइन दृश्य में एक नया प्रपत्र बनाएँ और खोलें।
-
प्रपत्र पर एक लिस्टबॉक्स नियंत्रण डालें, संपत्ति पत्रक प्रदर्शित करें और उसका नाम बदलें List0 . के लिए संपत्ति का मूल्य ।
-
इसका चाइल्ड लेबल बदलें कैप्शन टेबल्स . के लिए मान ।
-
ListBox नियंत्रण की प्रॉपर्टी शीट प्रदर्शित करें और पंक्ति स्रोत . सेट करें lvTables . के लिए गुण मान नाम।
-
जांचें कि क्या पंक्ति स्रोत प्रकार तालिका/क्वेरी के रूप में सेट है और बाउंड कॉलम गुण मान 1 है। यदि भिन्न है तो बदलें।
-
ActiveX नियंत्रण सूची से एक ListView नियंत्रण डालें और उसका नाम संपत्ति मान ListView1 में बदलें ।
-
ऊपर दिए गए डेमो फॉर्म इमेज में दिखाए गए अनुसार दोनों नियंत्रणों का आकार बदलें।
-
नियंत्रणों के ऊपर एक लेबल डालें और उसका नाम और शीर्षक संपत्ति मान शीर्षक में बदलें। जब ListBox से कोई तालिका या क्वेरी चुनी जाती है, तो कैप्शन मान vba कोड से बदल जाएगा।
-
नियंत्रणों के नीचे एक कमांड बटन बनाएं और इसके नाम गुण मान को cmdClose . में बदलें और कैप्शन गुण मान बंद करें ।
-
लिस्ट व्यू कंट्रोल पर राइट-क्लिक करें, ListViewCtrl ऑब्जेक्ट को हाइलाइट करें विकल्प चुनें, और गुण . चुनें ।
-
सामान्य . में सेटिंग के साथ मिलान करने के लिए प्रॉपर्टी सेटिंग बदलें नीचे दी गई टैब छवि।
-
लिस्ट व्यू कंट्रोल प्रॉपर्टी शीट इमेज - सामान्य टैब व्यू नीचे दिया गया है:
इनमें से कुछ विकल्प हम पहले के सत्रों में निर्धारित कर चुके हैं। यहां हमें अपनी ड्रैग ड्रॉप कार्रवाई के लिए निम्नलिखित विकल्पों की आवश्यकता है:
-
OLEDragAutomatic - 1
-
OLEDropमैनुअल - 1
-
FullRowSelect - सही
-
हॉटट्रैकिंग - सही
-
सुनिश्चित करें कि उपरोक्त सेटिंग्स आपकी प्रॉपर्टी शीट से मेल खाती हैं, फिर फॉर्म को सेव करें।
प्रपत्र का VBA मॉड्यूल प्रदर्शित करें।
फॉर्म मॉड्यूल VBA कोड।
मौजूदा कोड लाइनों, यदि कोई हो, को अधिलेखित करते हुए, निम्नलिखित VBA कोड को मॉड्यूल में कॉपी और पेस्ट करें:
Option Compare Database Option Explicit Dim lvwList As MSComctlLib.ListView Dim strTable As String Dim db As DAO.Database Dim rst As DAO.Recordset Private Sub Form_Load() Set lvwList = Me.ListView1.Object End Sub Private Sub Form_Unload(Cancel As Integer) On Error GoTo Form_Unload_Err Dim lvItem As ListItem Dim tmp As Long Dim criteria As String Dim strfield As String Dim flag As Boolean Dim fld As String If strTable = "" Then Set lvwList = Nothing Exit Sub End If Set db = CurrentDb Set rst = db.OpenRecordset(strTable, dbOpenDynaset) flag = False For Each lvItem In lvwList.ListItems tmp = lvItem.Index strfield = lvwList.ColumnHeaders(1).Text criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34) rst.FindFirst criteria If Not rst.NoMatch Then If (rst.Fields(strfield).Value = lvItem.Text) _ And (rst.Fields(1).Value = tmp) Then 'GoTo nextitem Else rst.Edit rst.Fields(1).Value = tmp rst.Update End If Else MsgBox "Item: " & tmp & " Not Found!" End If Next rst.Close Set lvwList = Nothing Set lvItem = Nothing Set rst = Nothing Set db = Nothing Form_Unload_Exit: Exit Sub Form_Unload_Err: MsgBox Err & " : " & Err.Description, , "Form_Unload()" Resume Form_Unload_Exit End Sub Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object) ' When a ColumnHeader object is clicked, the ListView control ' sorts the data of that column. On the first Click on the Column 'will sort in Ascending Order, second Click will sort in Descending With Me.ListView1 ' Set the SortKey to the Index of the ColumnHeader - 1 .SortKey = ColumnHeader.Index - 1 ' Set Sorted to True to sort the list. If .SortOrder = lvwAscending Then .SortOrder = lvwDescending Else .SortOrder = lvwAscending End If .Sorted = True End With End Sub Private Sub List0_Click() strTable = List0.Value Call LoadListView(strTable) End Sub Private Sub LoadListView(ByVal s_Datasource As String) On Error GoTo LoadListView_Err Dim j As Integer Dim tmpLItem As MSComctlLib.ListItem Dim strHeading As String strHeading = UCase(s_Datasource) With Me.Heading .caption = strHeading .FontName = "Courier New" .FontSize = 20 .FontItalic = True .FontBold = True End With 'Initialize ListView Control lvwList.ColumnHeaders.Clear lvwList.ListItems.Clear Set db = CurrentDb Set rst = db.OpenRecordset(s_Datasource, dbOpenSnapshot) 'Initialize ListView & Column Headers Property Values With lvwList .Font.Size = 10 .Font.Name = "Verdana" .Font.Bold = False .GridLines = True End With With lvwList 'Syntax: .ColumnHeaders.Add Index, Key, Text, Width in Pixels, Alignment, Icon For j = 0 To rst.Fields.Count - 1 .ColumnHeaders.Add , , rst.Fields(j).Name, IIf(j = 0, 3000, 1400), 0 Next End With Dim I As Long rst.MoveFirst Do While Not rst.BOF And Not rst.EOF 'Syntax: lvwList.ListItems.Add Index, Key, Text, Icon, SmallIcon Set tmpLItem = lvwList.ListItems.Add(, , rst.Fields(0).Value) 'Name column 'Syntax: tmpLItem.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText With tmpLItem For j = 1 To rst.Fields.Count - 1 .ListSubItems.Add , , Nz(rst.Fields(j).Value, "") Next End With rst.MoveNext Loop rst.Close With lvwList If .ListItems.Count > 0 Then .ListItems(1).Selected = True End If End With Set db = Nothing Set rst = Nothing LoadListView_Exit: Exit Sub LoadListView_Err: MsgBox Err & " : " & Err.Description, , "LoadListView()" Resume LoadListView_Exit End Sub Private Sub ListView1_OLEDragOver(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer) 'Highlight the item when draged over it Set ListView1.DropHighlight = ListView1.HitTest(x, y) End Sub Private Sub ListView1_OLEDragDrop(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) 'Item being dropped Dim lvwDrag As ListItem 'Item being dropped on Dim lvwDrop As ListItem 'Item being readded to the list Dim lvwTarget As ListItem 'Subitem reference in dropped item Dim lvwSub As ListSubItem 'Drop position Dim intTgtIndex As Integer Dim j As Integer Set lvwDrop = lvwList.HitTest(x, y) Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item 'Ignore overlapping drag or drop Item actions If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then Set lvwList.DropHighlight = Nothing Set lvwDrop = Nothing Set lvwDrag = Nothing Exit Sub End If 'Save the droped position Index Number intTgtIndex = lvwDrop.Index 'Remove Dragged Item from its old position lvwList.ListItems.Remove lvwDrag.Index 'For j = intTgtIndex To ListItems.Count 'Creates a new Item in the Target Item position 'with the Dropped Item Index Number and Dragged Item.Text. 'Saves the new Item reference in lvwTarget Item. '* The original Droped-on Target) Item will be moved down '* by incrementing its original Index Number Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) 'Copy the original Draged Item's subitems to the new item If lvwDrag.ListSubItems.Count > 0 Then For Each lvwSub In lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text Next End If 'Highlight the draged item in its new position lvwTarget.Selected = True 'Destroy all objects Set lvwTarget = Nothing Set lvwDrag = Nothing Set lvwDrop = Nothing Set lvwList.DropHighlight = Nothing End Sub Private Sub cmdClose_Click() DoCmd.Close acForm, Me.Name End Sub
आप नए जोड़े गए सबरूटीन्स को छोड़कर उपरोक्त VBA कोड से परिचित हैं:ListView1_OLEDragOver(), ListView1_OLEDragDrop(), Form_Unload(), और ListView1_ColumnClick() प्रक्रियाएं। पहली दो प्रक्रियाएं हमें एक आइटम (पंक्ति) को खींचने में मदद करेंगी और इसे किसी अन्य आइटम पर एक नए स्थान में डालने के लिए छोड़ देंगी। प्रक्रियाएँ Form_Unload() और ListView1_ColumnClick() आइटम्स को सॉर्ट करेंगी।
निम्नलिखित छवियां इसके निष्पादन के क्रम में ड्रैग एंड ड्रॉप क्रिया को दिखाती हैं
नीचे दी गई पहली छवि ड्रैग एंड ड्रॉप एक्शन सीक्वेंस दिखाती है। कर्मचारी आईडी 7 के साथ ListItem, उपयोगकर्ता द्वारा खींच लिया जाता है और ID 3 के साथ ListItem पर गिर जाता है।
दूसरी छवि ListItem की चाल को उल्टे क्रम में दिखाती है।
जब माउस पॉइंटर खींचे गए आइटम के साथ स्रोत और लक्ष्य पंक्तियों के बीच एक पंक्ति पर चलता है, तो रास्ते में एक के बाद एक हाइलाइट करेगा।
द ड्रैग एंड ड्रॉप एक्शन इन पिक्चर्स।
कर्मचारी आईडी 7 वाली पंक्ति ऊपर कर्मचारी आईडी 3 वाले आइटम पर छोड़ दी जाती है।VBA कोड सेगमेंट-वार विश्लेषण।
<मजबूत शैली ="पृष्ठभूमि-अनुलग्नक:प्रारंभिक; पृष्ठभूमि-क्लिप:प्रारंभिक; पृष्ठभूमि-छवि:प्रारंभिक; पृष्ठभूमि-मूल:प्रारंभिक; पृष्ठभूमि-स्थिति:प्रारंभिक; पृष्ठभूमि-दोहराना:प्रारंभिक; पृष्ठभूमि-आकार:प्रारंभिक; रंग:# 0e101a; मार्जिन-बॉटम:0pt; मार्जिन-टॉप:0pt;"> ListBox से एक आइटम चयन List0_Click() ईवेंट प्रक्रिया चलती है और रिकॉर्ड्स को ListView नियंत्रण में लोड करती है।
Private Sub List0_Click() Dim strTable As String strTable = List0.Value Call LoadListView(strTable) End Sub
चयनित तालिका/क्वेरी नाम strTable . में सहेजा जाता है स्ट्रिंग चर। LoadListView() सबरूटीन पैरामीटर के रूप में strTable चर के साथ चलता है। हम पिछले सत्रों में इस संहिता को एक से अधिक बार पढ़ चुके हैं, और आप विवरण के लिए इस पृष्ठ के नीचे दिए गए लिंक का उपयोग करके उन पृष्ठों पर जा सकते हैं। मेरे द्वारा इस संहिता में किए गए कुछ छोटे परिवर्तन आपको मिल सकते हैं।
हमने इस कड़ी आइकन, स्मॉलआइकॉन . में इमेजलिस्ट कंट्रोल का उपयोग नहीं किया है ListItems में पैरामीटर मान। जोड़ें () विधि और ReportIcon, TooltipText ListSubItems.Add() विधि में पैरामीटर मान का भी उपयोग नहीं किया गया।
आइए देखें कि ListView1_OLEDragOver() . में क्या हो रहा है और ListView1_OLEDragDrop() वीबीए कोड सेगमेंट।
ListView1_OLEDragOver() प्रक्रिया।
Private Sub ListView1_OLEDragOver(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer) 'Highlight the item when draged over it Set ListView1.DropHighlight = ListView1.HitTest(x, y) End Sub
जब आप किसी पंक्ति पर क्लिक और होल्ड करने का प्रयास करते हैं, तो यह प्रक्रिया स्वचालित रूप से निष्पादित होती है, लक्ष्य पंक्ति की ओर जाने वाली अन्य पंक्तियों को खींचना और स्थानांतरित करना शुरू करती है। ड्रैग एक्शन एक और पंक्ति पर चलता है जो इसे हाइलाइट किया जाएगा।
ListView1.HitTest(x, y) फ़ंक्शन x, y निर्देशांक पढ़ता है जो ListView नियंत्रण पर पंक्ति स्थिति निर्धारित करता है और उस पंक्ति को हाइलाइट करता है। यह प्रक्रिया तब तक जारी रहती है जब आप अन्य पंक्तियों के ऊपर होते हैं जब तक कि आप इसे माउस बटन को छोड़ कर लक्ष्य पंक्ति पर नहीं छोड़ते। ड्रॉप एक्शन ListView1_OLEDragDrop() . को ट्रिगर करता है प्रक्रियाओं पर स्रोत पंक्ति के परिवर्तन को क्रियान्वित करता है और क्रियान्वित करता है।
ListView1_OLEDragDrop प्रक्रिया।
Private Sub ListView1_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) 'Item being dragged Dim lvwDrag As ListItem 'Item being dropped on Dim lvwDrop As ListItem 'Item being added to the list Dim lvwTarget As ListItem 'Subitem reference used in For . . .Next loop
Dim lvwSub As ListSubItem 'Drop position index Dim intTgtIndex As Integer Set lvwDrop = lvwList.HitTest(x, y) 'save the source item Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item 'Ignore overlapping drag or drop Item actions If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then Set lvwList.DropHighlight = Nothing Set lvwDrop = Nothing Set lvwDrag = Nothing Exit Sub End If 'Save the droped position Index Number intTgtIndex = lvwDrop.Index 'Remove Dragged Item from its old position lvwList.ListItems.Remove lvwDrag.Index 'Creates a new Item in the Target Item position 'with the Dropped Item Index Number and Dragged Item.Text. 'Saves the new Item reference in lvwTarget Item. '* The original Droped-on Target) Item will be moved down '* by incrementing its original Index Number Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) 'Copy the original Draged Item's subitems to the new item If lvwDrag.ListSubItems.Count > 0 Then For Each lvwSub In lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text Next End If 'Highlight the draged item in its new position lvwTarget.Selected = True 'Destroy all objects Set lvwTarget = Nothing Set lvwDrag = Nothing Set lvwDrop = Nothing Set lvwList.DropHighlight = Nothing End Sub
आइए हम इस प्रक्रिया की भाग-दर-भाग समीक्षा करें और समझें कि वहां क्या हो रहा है। निम्नलिखित कोड खंड ड्रैग एंड ड्रॉप क्रिया को संभालने के लिए आवश्यक वस्तु चर घोषित करता है:
'Item being dragged Dim lvwDrag As ListItem 'Item being dropped on Dim lvwDrop As ListItem 'Reference of the Item being added to the list Dim lvwTarget As ListItem 'Subitem reference used in For . . .Next loop Dim lvwSub As ListSubItem 'Drop position index Dim intTgtIndex As Integer Set lvwDrop = lvwList.HitTest(x, y) Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item
पहले तीन ListItem अस्थायी ऑब्जेक्ट अलग-अलग नामों से घोषित करते हैं।
lvwDrag ListItem ऑब्जेक्ट उस पंक्ति की प्रतिलिपि रखेगा जिसे हम एक नए स्थान पर खींचने के लिए चुनते हैं।
lvwDrop ListItem ऑब्जेक्ट उस पंक्ति के संदर्भ को सहेज लेगा जिस पर हम खींची गई सूची आइटम छोड़ते हैं।
ListItems क्रिया के परिवर्तन-ओवर के दौरान, हम स्रोत आइटम को उसके मूल स्थान से हटा देंगे, फिर इसे लक्ष्य स्थान में बना देंगे, स्रोत ListItem अनुक्रमणिका संख्या के साथ। इस नई ListItem के संदर्भ lvwTarget . में सहेजे जाते हैं ListItem वस्तु चर।
lvwSub वेरिएबल को For में सीक्वेंसिंग ऑब्जेक्ट वेरिएबल के रूप में घोषित किया गया है। . .अगला कुंडली। इस लूपिंग को lvwDrag ऑब्जेक्ट से एक-एक करके ListSubItems, (दूसरा कॉलम आगे) के माध्यम से अनुक्रमित करने की आवश्यकता है। भले ही हमने मूल ListItem को हटा दिया है, हमने इसकी एक प्रति lvwDrag ListItem ऑब्जेक्ट में सहेज ली है।
lvwDrop ListItem अनुक्रमणिका संख्या intTgtIndex . में सहेजी जाती है चर।
lvwList.HitTest(x, y) फ़ंक्शन ListView नियंत्रण के x, y निर्देशांक पढ़ता है और लक्ष्य ListItem की पहचान करता है जहां हमने स्रोत ListItem को छोड़ दिया है और lvwDrop ऑब्जेक्ट में इसकी एक प्रति बनाता है।
नई स्थिति में खींचने से पहले हम एक ListItem का चयन करेंगे।
lvwList.SelectedItem संपत्ति को सत्य के रूप में सेट किया जाएगा। इस संपत्ति की स्थिति की मदद से, हम चयनित ListItem की एक प्रति lvwDrag में बनाते हैं सूची वस्तु वस्तु। अगला कोड खंड स्रोत और लक्ष्य ListItem ऑब्जेक्ट्स दोनों को मान्य करता है।
ड्रैग-ड्रॉप कार्रवाई पर सत्यापन जांच।
'Ignore overlapping drag or drop Item actions, 'OR drag and drop happens on the same ListItem. If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then Set lvwList.DropHighlight = Nothing Set lvwDrop = Nothing Set lvwDrag = Nothing Exit Sub End If
उपरोक्त कोड खंड ड्रैग एंड ड्रॉप एक्शन को मान्य करता है। यदि ये क्रियाएँ किसी मान्य आइटम पर प्रारंभ या समाप्त नहीं होती हैं, तो lvwDrop या lvwDrag ऑब्जेक्ट या दोनों खाली हो जाएंगे। या एक अन्य अमान्य चाल तब हो सकती है जब उपयोगकर्ता एक पंक्ति को ऊपर या नीचे ले जाता है लेकिन अपना विचार बदल सकता है और उसे उसी पंक्ति पर वापस छोड़ सकता है। इस प्रकार की गलत चालों का पता लगाने से कार्यक्रम समाप्त हो जाएगा।
यदि उपरोक्त परीक्षण मान्य साबित होता है तो प्रोग्राम पंक्तियों को पुनर्व्यवस्थित करने के लिए अगली प्रक्रिया को क्रियान्वित करना जारी रखेगा।
'Save the dropped position ListItem Index Number intTgtIndex = lvwDrop.Index 'Remove Dragged Item from its old position lvwList.ListItems.Remove lvwDrag.Index 'Creates a new Item in the Target Item position 'with the Dropped Item Index Number and Dragged Item.Text. 'Saves the new Item reference in lvwTarget Item. '* The original Droped-on Target) Item will be moved down '* by incrementing its original Index Number Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) 'Copy the original Draged Item's subitems to the new item If lvwDrag.ListSubItems.Count > 0 Then For Each lvwSub In lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text Next End If 'Highlight the draged item in its new position lvwTarget.Selected = True
निष्पादन योग्य कोड की उपरोक्त नौ पंक्तियाँ (अन्य पंक्तियाँ टिप्पणियाँ हैं) क्रियाएँ कुछ हद तक सीधी हैं।
intTgtIndex =lvwDrop.Index कथन intTgtIndex . में लक्ष्य ListItem की अनुक्रमणिका संख्या सहेजता है चर।
चूंकि हमने अस्थायी ऑब्जेक्ट lvwDrag में सोर्स रो लिस्टआइटम को पहले ही सेव कर लिया है, अगला कदम लिस्ट व्यू कंट्रोल से सोर्स लिस्टआइटम को हटाना है। ListItems.Remove() प्रक्रिया कहा जाता है, कथन के साथ lvwList.ListItems.Remove lvwDrag.Index ।
संक्षेप में, ड्रैग ड्रॉप क्रिया एक ListItem को उसके मूल स्थान से हटाना और लक्ष्य पंक्ति अनुक्रमणिका संख्या के साथ लक्ष्य स्थान पर फिर से बनाना है।
कथन lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) सेट करें अपनी लक्षित स्थान अनुक्रमणिका संख्या intTgtIndex और पाठ . के साथ नई ListItem बनाता है स्रोत ListItem का मान पहले lvwDrag ऑब्जेक्ट में सहेजा गया था।
पहली बार ListItem बनाते समय, हमने केवल इन दो मानों, अनुक्रमणिका और पाठ का उपयोग किया है पैरामीटर मान। हमने अन्य पैरामीटर विकल्पों का उपयोग नहीं किया है कुंजी, चिह्न, और SmallIcon अन्यथा हमें उन पैरामीटर मानों को lvwDrag ऑब्जेक्ट से भी शामिल करना चाहिए।
ऊपर दिखाए गए हमारे ड्रैग ड्रॉप उदाहरण छवियों के अनुसार हमने 7 वीं लिस्टइटम को स्थानांतरित कर दिया है और इसे तीसरी लिस्टइटम पर छोड़ दिया है। उसके बाद, हमने सूची दृश्य नियंत्रण से 7वां आइटम (या स्रोत ListItem) हटा दिया है। लक्ष्य अनुक्रमणिका संख्या 3 के साथ एक नया ListItem बनाया गया।
अब, एक ही इंडेक्स नंबर 3 के साथ दो आइटम हैं, मौजूदा एक इंडेक्स नंबर 3 के साथ और नया जिसे हमने इंडेक्स नंबर 3 के साथ बनाया है। अन्य सभी जानकारी lvwDrag ऑब्जेक्ट (या lvwDrag में सहेजी गई 7 वीं लिस्टआइटम) से ली गई है। वस्तु पहले)।
सिस्टम स्वचालित रूप से मौजूदा ListItem 3 को अगले क्रम संख्या 3,4,5 तक बढ़ा देता है। . . 4,5,6 तक। . . और आने वाले आइटम को बीच में डालने के लिए जगह देने के लिए उन्हें आगे ले जाता है।
एक पंक्ति को हटाने और इसे कहीं और बनाने का प्रभाव।
मान लें कि हम उस चाल को उल्टे क्रम में करते हैं, जैसे ऊपर से ListItem नंबर 3 को खींचें और आइटम नंबर 7 पर छोड़ दें तो क्या होता है?
स्वाभाविक रूप से, हम तीसरे आइटम को हटा देंगे और नए स्थान पर इंडेक्स नंबर 7 के साथ एक नया आइटम बनाने का प्रयास करेंगे। जब आइटम नंबर 3 को हटा दिया जाता है तो आइटम नंबर 4 आगे शिफ्ट हो जाएगा या 4,5,6,7,8,9 3,4,5,6,7,8 हो जाएगा (सभी आइटम्स को क्रम से बनाने के लिए) या पहले वाला इंडेक्स नंबर 7 वाला आइटम 6 हो जाएगा।
जब हम इंडेक्स नंबर 7 के साथ नया आइटम बनाते हैं तो मौजूदा 7,8 फिर से 8,9 हो जाएगा। जब हम पंक्ति विलोपन और निर्माण समय के दौरान पंक्तियों की गति को देखते हैं तो पहला उदाहरण आने वाली वस्तु के लिए रास्ता बनाने के लिए लक्ष्य पंक्ति को नीचे ले जाएगा। दूसरे उदाहरण में समझाया गया है (3 से 7) गंतव्य पंक्ति ऊपर जाएगी।
नोट: देखो tजब हम ListItem को पुनर्व्यवस्थित करते हैं तो ListItem के लिए एक सुराग के रूप में रखने के लिए वह कर्मचारी आईडी मान देता है।
मैंने ड्रैग-ड्रॉप ऑपरेशंस में हर जगह ListItem का उल्लेख किया है। ListItem केवल ListView पंक्ति के पहले कॉलम को संदर्भित करता है। अन्य स्तंभ मान ListSubItems या ListItem के चाइल्ड-आइटम हैं। इसका मतलब है कि आप पहले कॉलम को ही ड्रैग एंड ड्रॉप कर पाएंगे। अन्य कॉलम या ListSubItems को VBA कोड के साथ ListItem के तहत ले जाया जाएगा।
यह सच है अगर आपने FullRowSelection . को सक्षम नहीं किया है सामान्य . पर ListView नियंत्रण संपत्ति पत्रक पर टैब।
यदि सक्षम किया गया है तो आप किसी भी कॉलम का चयन कर सकते हैं, लेकिन सिस्टम पंक्तियों के पुन:क्रम के उद्देश्यों के लिए ListItem अनुक्रमणिका को संदर्भित करता है। उपरोक्त दो छवियों की तुलना दो नमूना छवियों के दूसरे सेट, इस पृष्ठ के शीर्ष से तीसरी और चौथी छवियों के साथ करें।
यदि निम्न दो गुण मान सामान्य पर ListView नियंत्रण संपत्ति पत्रक पर सेट नहीं हैं, तो ड्रैग एंड ड्रॉप क्रिया काम नहीं करेगी टैब.:
- ccOLEDragAutomatic =1
- ccOLEDropManual =1
अगले पांच कथन ListSubItems, . को स्थानांतरित कर देंगे यदि कोई हो, तो नए स्थान में नव निर्मित ListItem के लिए।
इसके बाद, नव निर्मित ListItem हाइलाइट किया गया है।
इसके बाद, बनाए गए सभी अस्थायी ऑब्जेक्ट मेमोरी से साफ़ हो जाते हैं।
नोट: यहां ध्यान देने योग्य एक और महत्वपूर्ण बात यह है कि यह व्यवस्था अस्थायी है और जब आप प्रपत्र को बंद करते हैं या सूची दृश्य नियंत्रण पर कोई अन्य तालिका/क्वेरी लोड करते हैं तो यह व्यवस्था समाप्त हो जाती है।
यदि हम चाहते हैं कि ListItems का बदला हुआ क्रम स्थायी बना रहे, या जब तक अगली बार ऑर्डर नहीं बदला जाता है, तो हमें टेबल पर ही वर्तमान अनुक्रमित ऑर्डर संख्या को अपडेट करने में सक्षम होना चाहिए। हमने कर्मचारी तालिका पर फ़ील्ड-नाम आईडी के साथ एक नया पूर्णांक फ़ील्ड जोड़ा है।
वर्णानुक्रम में पुनर्व्यवस्थित कर्मचारी डेटा के साथ नमूना स्क्रीन नीचे दी गई है:
चूंकि कर्मचारी आईडी फ़ील्ड एक ऑटोनंबर फ़ील्ड है और अन्य संबंधित तालिकाओं से जुड़ा हुआ है, इसलिए हमने फ़ील्ड नाम आईडी के साथ एक नया नंबर फ़ील्ड जोड़ा है। यह फ़ील्ड मान प्रारंभ में कर्मचारी आईडी से मैन्युअल रूप से समान अनुक्रम संख्याओं के साथ सेट किया गया है। यह फ़ील्ड मान प्रारंभ में इस क्रम में होगा। लेकिन, जब आप ड्रैग एंड ड्रॉप क्रिया के कारण ListView नियंत्रण पर डेटा को पुनर्व्यवस्थित करते हैं, तो ListView Rows डेटा उनके क्रम को बदल सकता है।
देखें कर्मचारीQ क्वेरी SQL नीचे दी गई है:
SELECT [FirstName] & " " & [LastName] AS EmployeeName, Employees.ID, Employees.EmployeeID, Employees.TitleOfCourtesy, Employees.Title, Employees.Address, Employees.City, Employees.Region, Employees.PostalCode, Employees.Country, Employees.HomePhone, Employees.Extension, Employees.Notes FROM Employees ORDER BY Employees.ID;
उपरोक्त क्वेरी का उपयोग सूची दृश्य नियंत्रण के लिए डेटा स्रोत के रूप में किया जाता है और उन्हें आईडी फ़ील्ड पर क्रमबद्ध किया जाता है। सूची दृश्य नियंत्रण पर अनुक्रमणिका संख्याओं के परिवर्तित क्रम के साथ ID फ़ील्ड को अद्यतन किया जाता है। अपडेट करने की प्रक्रिया Form_Unload() . से चलती है घटना प्रक्रिया जब आप प्रपत्र बंद करते हैं। यह विधि सुनिश्चित करती है कि जब आप अगली बार ListView Control खोलते हैं तो डेटा उस क्रम में होगा जैसा आपने पिछली बार फिर से व्यवस्थित किया था।
Form_Unload() घटना प्रक्रिया VBA कोड।
Private Sub Form_Unload(Cancel As Integer) Dim lvItem As ListItem Dim tmp As Long Dim criteria As String Dim strfield As String Dim fld As String If strTable = "" Then Set lvwList = Nothing Exit Sub End If Set db = CurrentDb Set rst = db.OpenRecordset(strTable, dbOpenDynaset) For Each lvItem In lvwList.ListItems tmp = lvItem.Index strfield = lvwList.ColumnHeaders(1).Text 'EmployeeName criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34) rst.FindFirst criteria If Not rst.NoMatch Then If (rst.Fields(strfield).Value = lvItem.Text) And (rst.Fields(1).Value = tmp) Then 'GoTo nextitem Else rst.Edit rst.Fields(1).Value = tmp 'replace ID number rst.Update End If Else MsgBox "Item: " & tmp & " Not Found!" End If Next rst.Close Set lvwList = Nothing Set lvItem = Nothing Set rst = Nothing Set db = Nothing End Sub
कर्मचारी नाम की जांच करें उपरोक्त छवि में फ़ील्ड मान। उन्हें वर्णानुक्रम में व्यवस्थित किया गया है। कर्मचारी तालिका पर नया आईडी फ़ील्ड मान उनके वर्तमान ListView नियंत्रण ListItem अनुक्रमणिका क्रमांक के साथ अद्यतन किया जाएगा।
यदि आप निम्नलिखित बिंदुओं पर ध्यान दें तो आप आसानी से समझ सकते हैं कि हम उपरोक्त कोड के साथ क्या करते हैं:
-
ListItem's (पहला कॉलम) टेक्स्ट पैरामीटर मान कर्मचारी का नाम है और वर्णानुक्रम में व्यवस्थित है।
-
ListView Control पर ListItems में स्क्रीन पर दिखाए जाने के क्रम में 1 से 9 तक के इंडेक्स नंबर होते हैं, यानी पहले आइटम का इंडेक्स नंबर 1 होता है और आखिरी वाला 9 होता है। कर्मचारी तालिका आईडी फ़ील्ड मान पर मूल डेटा नहीं है इस क्रम में।
-
हम पाठ लेते हैं पहली ListItem का मान (कर्मचारी का नाम) और टेबल पर नाम खोजें।
-
जब रिकॉर्ड मिल जाता है तो तालिका पर आईडी फ़ील्ड पर वर्तमान ListItem की अनुक्रमणिका संख्या अद्यतन (प्रतिस्थापित) की जाती है।
-
मेज पर शेष सभी अभिलेखों के लिए इस प्रक्रिया को दोहराया गया था।
आइए वीबीए कोड के माध्यम से चलते हैं। शुरुआत में, हम जांचते हैं कि स्रोत डेटा तालिका/क्वेरी ListView नियंत्रण में लोड की गई थी या नहीं?
अगर strTable वेरिएबल को क्वेरी नाम से प्रारंभ नहीं किया गया है तो ListView नियंत्रण खाली है। यदि ऐसा है तो उपयोगकर्ता ने फॉर्म को खोला और सूची दृश्य नियंत्रण में डेटा लोड करने के लिए क्वेरी नाम का चयन किए बिना इसे बंद कर दिया। फॉर्म_अनलोड इस बिंदु पर घटना प्रक्रिया को निरस्त कर दिया जाता है और फ़ॉर्म को बंद कर देता है।
यदि सूची दृश्य नियंत्रण में डेटा है तो अगला चरण निष्पादित किया जाता है और स्रोत डेटा क्वेरी कर्मचारीक्यू को अद्यतन करने के लिए खोलता है।
अगला कदम प्रत्येक ListItem के माध्यम से जाना और कर्मचारी रिकॉर्ड के आईडी फ़ील्ड में अनुक्रमणिका संख्या को अपडेट करना है।
सबसे पहले, वर्तमान पंक्ति अनुक्रमणिका संख्या tmp . में सहेजी जाती है चर।
पहला lvwList.ColumnHeader नाम कर्मचारी नाम और कर्मचारी का नाम ListItem.Text . से लिया गया है मानदंड . में व्यंजक में स्ट्रिंग वैरिएबल, जैसे कर्मचारी नाम ="एंड्रयू फुलर"।
पहला.FindFirst मानदंड कमांड दिए गए नाम के साथ रिकॉर्ड खोजने के लिए स्रोत डेटा तालिका की खोज करता है। जब रिकॉर्ड मिल जाता है तो मौजूदा लिस्टआइटम इंडेक्स नंबर आईडी फील्ड पर अपडेट हो जाता है।
यह प्रक्रिया ListView Control पर सभी पंक्तियों के लिए दोहराई जाती है और जब फॉर्म समाप्त हो जाता है तो इसे बंद कर दिया जाता है।
अगली बार जब आप इस क्वेरी से रिकॉर्ड्स को लिस्ट व्यू कंट्रोल में लोड करेंगे तो वे उसी क्रम में प्रदर्शित होंगे जब आपने पिछली बार फॉर्म को बंद किया था।
नोट:आईडी फ़ील्ड पर डेटा को सॉर्ट करने और उन्हें लिस्ट व्यू कंट्रोल पर बदले हुए क्रम में प्रदर्शित करने के लिए यहां क्वेरी आवश्यक हो गई।
यह सारा काम डेटा को अंतिम क्रमबद्ध क्रम में सहेजने के लिए था ताकि अगली बार जब आप प्रपत्र खोलेंगे तो सूची दृश्य नियंत्रण पर डेटा उसी क्रम में होगा।
Windows Explorer Like Sorting Method.
विंडोज एक्सप्लोरर में, आप किसी भी कॉलम हेडिंग पर क्लिक करके प्रदर्शित सूची को आरोही या अवरोही क्रम में सॉर्ट कर सकते हैं। कॉलम हैडर टॉगल बटन की तरह काम करेगा। कॉलम हैडर पर बार-बार क्लिक करने से कॉलम डेटा को आरोही/अवरोही क्रम में निम्न ListView1_ColumnClick() के अनुसार क्रमबद्ध किया जाएगा। घटना प्रक्रिया:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object) ' When a ColumnHeader object is clicked, the ListView control is ' sorted by the subitems of that column. With Me.ListView1 ' Set the SortKey to the Index of the ColumnHeader - 1 .SortKey = ColumnHeader.Index - 1 If .SortOrder = lvwAscending Then .SortOrder = lvwDescending Else .SortOrder = lvwAscending End If ' Set Sorted to True to sort the list. .Sorted = True End With End Sub
नोट: सभी डेटा की छँटाई केवल पाठ तुलना मोड में है। सूची आइटम और ListSubItems जोड़ें () विधि का तीसरा पैरामीटर, ListView नियंत्रण पर प्रदर्शित जानकारी पाठ है प्रकार। दिनांक और संख्यात्मक मान सभी को केवल पाठ के रूप में माना जाता है।
विंडोज एक्सप्लोरर फोल्डर में आइटम्स के आखिरी सॉर्ट किए गए ऑर्डर को सेव करता है। जब हम उस फोल्डर को फिर से खोलते हैं तो सूची पहले के क्रमबद्ध क्रम में प्रदर्शित होगी।
फॉर्म_अनलोड () . के साथ घटना प्रक्रिया विंडोज एक्सप्लोरर की यह सुविधा कर्मचारी टेबल पर संभव हो जाती है। जब आप किसी कॉलम पर सॉर्ट करने के बाद फॉर्म को बंद करते हैं तो अनुक्रमित ऑर्डर अनुक्रम आईडी फ़ील्ड में कर्मचारी तालिका पर सहेजा जाएगा। कर्मचारी क्यू क्वेरी हमेशा खोले जाने पर आईडी फ़ील्ड पर डेटा को सॉर्ट करती है।
डेमो डेटाबेस डाउनलोड करने के लिए संलग्न है। डेटाबेस में दो डेमो फॉर्म हैं। पहला फॉर्म डेटाशीट व्यू में डेटा देखने के लिए लिस्ट व्यू कंट्रोल में टेबल्स और क्वेरीज़ के उद्घाटन को दर्शाता है। दूसरा फॉर्म केवल कर्मचारीQ . का उपयोग करता है भविष्य में उपयोग के लिए डेटा के अंतिम क्रम के क्रम को ड्रैग, ड्रॉप, सॉर्ट और सेव करने के लिए अकेले क्वेरी करें।
- ActiveX ListView Control Tutorial-01.
- सूची दृश्य नियंत्रण ट्यूटोरियल-02.
- सूची दृश्य आइटम में छवियां असाइन करना।
- सूची दृश्य नियंत्रण ड्रैग-ड्रॉप सॉर्ट इवेंट
- एमएस-एक्सेस ट्री व्यू के साथ लिस्ट व्यू कंट्रोल
- ट्री व्यू/लिस्ट व्यू ड्रैग-ड्रॉप इवेंट को नियंत्रित करता है