Access
 sql >> база данни >  >> RDS >> Access

ListView Control Събития за сортиране с плъзгане и пускане

Пренареждане на редове с данни в ListView Control.

В по-ранния епизод на този урок научихме как да пренареждаме колоните, като активираме тази функция:AllowColumnReorder опция в листа със свойства. Но преместването на ред се извършва чрез плъзгане и поставяне на друг ред. За пренареждане на контролните редове ListView, действието ListItem Drag and Drop изисква активиране на тази функция в листа със свойства. Но това само по себе си няма да работи, има нужда от VBA код, за да пренареди елемента в необходимия му ред.

Нека създадем примерен формуляр за достъп с контроли и VBA код в нашата база данни за това упражнение. Примерното изображение на формуляра с контроли ListBox и ListView е дадено по-долу.

Създадохме списък с таблици и заявки (не заявки за действие) в списъчното поле. Избирането на един от елементите на списъка ще покаже записите незабавно в контролата ListView, както ги виждаме в изгледа DataSheet.

Задачата за проектиране.

  1. Създайте нова таблица с едно текстово поле с името на полето DataList .

  2. Запазете таблицата с името lvTables (lv означава ListView).

  3. Отворете таблицата в изглед на лист с данни.

  4. Добавете няколко имена на таблици и изберете имена на заявки от вашата база данни в таблицата. Импортирах таблици от примерната база данни на Northwind за моя списък.

    Забележка: Прикаченият файл Полето не е валидно в ListView Control. Създайте заявки за избор за таблици с поле за прикачен файл и изберете всички полета с изключение на полето за прикачени файлове.

  5. Създайте и отворете нов формуляр в Design View.

  6. Вмъкнете контрола ListBox във формуляра, покажете листа със свойства и променете неговото име стойност на свойството до List0 .

  7. Променете дъщерния му етикет Надпис стойност към Таблици .

  8. Покажете листа със свойства на контролата ListBox и задайте Източник на ред стойност на свойството към lvTables име.

  9. Проверете дали Типът източник на ред е зададен като Таблица/Заявка и стойността на свойството Bound Column е 1. Ако е различно, променете.

  10. Вмъкнете контрола ListView от списъка с ActiveX контроли и променете нейната стойност на свойството Name на ListView1 .

  11. Преоразмерете и двете контроли, както е показано на изображението на демонстрационния формуляр, дадено по-горе.

  12. Поставете етикет над контролите и променете стойностите на свойствата му за име и надпис на Заглавие. Стойността на надписа ще бъде променена от vba код, когато таблица или заявка бъде избрана от ListBox.

  13. Създайте команден бутон под контролите и променете стойността му на свойството Name на cmdClose и стойността на свойството Caption да Затвори .

  14. Щракнете с десния бутон върху контролата ListView, маркирайте ListViewCtrl обекта опция и изберете Свойства .

  15. Променете настройките на свойството, за да съответстват на настройките в Общи Изображение на раздел, дадено по-долу.

  16. Изображение на лист със свойства на контрола на ListView - Изглед на раздела Общи е даден по-долу:

    Някои от тези опции вече сме задали в по-ранните сесии. Тук имаме нужда от следните опции за нашето действие Drag Drop:

    • OLEDragAutomatic - 1

    • OLEDropManual - 1

    • FullRowSelect - Вярно

    • HotTracking – Вярно

Уверете се, че горните настройки съвпадат с вашия лист със свойства, след което запазете формуляра.

Покажете VBA модула на формуляра.

Кодът VBA на модула на формуляра.

Копирайте и поставете следния VBA код в модула, като презапишете съществуващите кодови редове, ако има такива:

Опция Compare DatabaseOption ExplicitDim lvwList Като MSComctlLib.ListViewDim strTable Като StringDim db Като DAO.DatabaseDim rst Като DAO.RecordsetPrivate Sub Form_Load() Задайте lvwList =Me.ListView1.ObjectView1.ObjectEndEnd) As ListItemDim tmp As LongDim критерии As StringDim strfield As StringDim flag As BooleanDim fld As StringIf strTable ="" ThenSet lvwList =Nothing Exit SubEnd IfSet db =CurrentDbSet rst =db.OpenRecordset(strTable, dbTable, dbsetalsistIlvteInL)Fever. tmp =lvItem.Index strfield =lvwList.ColumnHeaders(1).Текстови критерии =strfield &" =" &Chr(34) &lvItem.Text &Chr(34) rst.FindFirst критерии If Not rst.NoMatch Тогава If (prst. Полета(strfield).Value =lvItem.Text) _ И (rst.Fields(1).Value =tmp) След това 'GoTo nextitem Else rst.Edit rst.Fields(1).Value =tmp rst.Update Край, ако е друго MsgBox "Елемент:" &tmp &" Не е намерен!" Край IfNextrst.CloseSet lvwList =NothingSet lvItem =NothingSet rst =NothingSet db =NothingForm_Unload_Exit:Exit SubForm_Unload_Err:MsgBox Err &" :" &Err.Description, , "Form_Description, , "Form_Set" щракнете върху обект ColumnHeader, контролата ListView' сортира данните за тази колона. При първото щракване върху колоната ще се сортира във възходящ ред, второто щракване ще сортира в DescendingWith Me.ListView1 ' Задайте SortKey на индекса на ColumnHeader - 1 .SortKey =ColumnHeader.Index - 1 ' Задайте Sorted на True за сортиране Списъкът. Ако .SortOrder =lvwAscending Тогава .SortOrder =lvwDescending Else .SortOrder =lvwAscending Край Ако .Sorted =TrueEnd WithEnd SubPrivate Sub List0_Click()strTable =List0.ValueCall LoadList_View)SortOrder =lvwAscending Край Dim j As Integer Dim tmpLItem Като MSComctlLib.ListItem Dim strHeading Като низ strHeading =UCase(s_Datasource) With Me.Heading .caption =strHeading .FontName ="Courier New" .FontSize =20.FontSize =20ItaF Trud =. 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. Verdana" .Font.Bold =False .GridLines =True End With With lvwList 'Синтаксис:.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 Следващ край с Dim I, докато rst.MoveFirst правя, докато не rst.BOF и не rst.EOF 'Синтаксис:lvwList.ListItems.Add Index, Key, Text, Icon, SmallIcon Set =tmpLItem lvwList.ListItems.Add(, , rst.Fields(0).Value) 'Колона с име 'Синтаксис:tmpLItem.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText С tmpLItem За j - 1 Field To. 1 .ListSubItems.Add , , Nz(rst.Fields(j).Value, "") Следващ край с rst.MoveNext Loop rst.Close с lvwList Ако .ListItems.Count> 0 Тогава .ListItems(1).Selected =True Край, ако Край с Set db =Нищо Зададено rst =Нищо LoadListView_Exit:Exit SubLoadListView_Err:MsgBox Err &" :" &Err.Descripti on, , "LoadListView()"Resume LoadListView_ExitEnd SubPrivate Sub ListView1_OLEDragOver(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer) 'Маркирайте елемента, когато го плъзнете върху него Задайте ListView1.DropHighlight =ListView1.HitTest(x, y)End SubPrivate Sub ListView1_OLEDragDrop(данни като обект, ефект като дълъг, бутон като цяло число, Shift като цяло число, x като единичен, y като единичен)'Елементът се пускаDim lvwDrag' като списъкI Елементът се пуска наDim lvwDrop As ListItem'Item се чете в списъкаDim lvwTarget като ListItem'Subitem препратка в изпуснат itemDim lvwSub As ListSubItem'Drop positionDim intTgtIndex As IntegerDim j As IntegerDim j As IntegerDim'Subitem lvwDim lvwSub As ListSubItem'Drop positionDim intTgtIndex As IntegerDim j As IntegerDim j As IntegerDim'Subit. SelectedItem 'запазете копие на плъзгане на елемент'Игнорирайте припокриващи се действия с плъзгане или пускане на елемента Ако (lvwDrop е нищо) Или (lvwDrag е нищо) Или (lvwDrop =lvwDrag) След това задайте lvwList.DropHighlight =нищо Задайте lvwDrop =нищо не е зададено lvwDrop =Nothing Set lv Exit SubEnd If'Save the dropped position Index NumberintTgtIndex =lvwDrop.Index'Remove Dragged Item from its old positionlvwList.ListItems.Remove lvwDrag.Index'For j =intTgtIndex To ListItems.Count 'Creates Item new Target position in the Target индексния номер на изпуснатия артикул и изтегления Item.Text.'Запазва новата препратка към lvwTarget Item.'* Оригиналът Droped-on Target) Елементът ще бъде преместен надолу'* чрез увеличаване на първоначалния набор от Index NumberSet lvwTarget =lvwList.ListItems.Add (intTgtIndex, , lvwDrag.Text)'Копирайте поделементите на оригиналния Draged Item в новия itemIf lvwDrag.ListSubItems.Count> 0 Тогава за всеки lvwSub в lvwDrag.ListSubItems lvwTarget.ListSubItems.lvwTarget.ListSubItems,NextEwSub.Elv. Маркирайте преместения елемент в новата му позицияlvwTarget.Selected =True'Destroy all objectsSet lvwTarget =NothingSet lvwDrag =NothingSet lvwDrop =NothingSet lvwList.DropHighlight =NothingEnd SubPrivate Sub cmdClose_ClickName() DoseClickName() 

Запознат сте с горния VBA код с изключение на новодобавените подпрограми:ListView1_OLEDragOver(), ListView1_OLEDragDrop(), Form_Unload(), и ListView1_ColumnClik() процедури. Първите две процедури ще ни помогнат да плъзнем елемент (ред) и да го пуснем върху друг елемент, за да го вмъкнем на ново място. Процедурите Form_Unload() и ListView1_ColumnClick() ще сортират елементите.

Следните изображения показват действието Drag and Drop в последователности от неговото изпълнение

Първото изображение по-долу показва последователността от действия с плъзгане и пускане. ListItem, с EmployeeID 7, се плъзга нагоре от потребителя и пуска върху ListItem с ID 3.

Второто изображение показва движението на ListItem в обратен ред.

Когато показалецът на мишката се придвижи над ред с плъзгания елемент, между изходния и целевия ред, ще се маркира един след друг по пътя нагоре.

Действие с плъзгане и пускане в снимки.

Редът с идентификатор на служител 7 отпада върху елемента с идентификатор на служител 3 по-горе.

Анализ на VBA код по сегменти.

Избор на елемент от ListBox, процедурата за събитие List0_Click() се изпълнява и зарежда записите в контролата ListView.

Private Sub List0_Click()Dim strTable As StringstrTable =List0.Value Call LoadListView(strTable)End Sub

Избраното име на таблица/заявка се записва в strTable низ променлива. LoadListView() подпрограмата се изпълнява с променливата strTable като параметър. Минахме през този код повече от веднъж в по-ранни сесии и можете да посетите тези страници, като използвате връзките, предоставени в долната част на тази страница за подробности. Може да намерите няколко дребни промени, които направих в този код.

Не сме използвали контролата ImageList в този епизод Икона, малка икона Стойности на параметрите в метода ListItems.Add() и Икона на отчет, текст на подсказка стойностите на параметрите в метода ListSubItems.Add() също не се използват.

Нека разгледаме какво се случва в ListView1_OLEDragOver() и ListView1_OLEDragDrop() VBA кодови сегменти.

Процедурата 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) 'Откройте елемента, когато се плъзга върху него Задайте 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 be dragDim lvwDrag As ListItem'Item be dropped onDim lvwDrop As ListItem be added'Ite към listDim lvwTarget As ListItem'Subitem препратка, използвана в For . . .Next loop
Dim lvwSub As ListSubItem'Drop position indexDim intTgtIndex As IntegerSet lvwDrop =lvwList.HitTest(x, y) 'save the source itemSet lvwDrag =lvwListm.Selecteds it drappings a dragave it over I dragave it overI drop Item actionsIf (lvwDrop е нищо) Или (lvwDrag е нищо) Или (lvwDrop =lvwDrag) След това задайте lvwList.DropHighlight =Нищо Задайте lvwDrop =Нищо Задайте lvwDrag =Нищо Излезте SubEnd If'Запазване на изпуснатата позиция Index NumberpTgIndex. Премахване на плъзгания елемент от старата му позицияlvwList.ListItems.Remove lvwDrag.Index'Създава нов елемент в позицията на целевия елемент'с изпуснатия индекс на артикул и изтегления Item.Text.'Запазва новата препратка към артикула в lvwTarget Item.'* оригинален Droped-on Target) Елементът ще бъде преместен надолу'* чрез увеличаване на неговия оригинален Index NumberSet lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text)'Копирайте поделементите на оригиналния Draged Item в новия itemIf.ListListItems lvwItems> 0 След това Fo r Всеки lvwSub В lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text NextEnd If'Осветете изтегления елемент в новата му позицияlvwTarget.Selected =True'SlvetSwTarget.Selected =True'SlvetSwTarget.Selected =True'SlvetSwTarget. DropHighlight =NothingEnd Sub

Нека разгледаме тази процедура част по част и да разберем какво се случва там. Следният сегмент на кода декларира необходимите обектни променливи за обработка на действието плъзгане и пускане:

'Елементът се плъзгаDim lvwDrag As ListItem'Елементът се пуска наDim lvwDrop As ListItem'Референция на елемента, който се добавя към списъкаDim lvwTarget като ListItem'Подпоказател, използван в For . . .Next loopDim lvwSub As ListSubItem'Drop position indexDim intTgtIndex As IntegerSet lvwDrop =lvwList.HitTest(x, y)Set lvwDrag =lvwList.SelectedItem 'save a copy of> 

Първите три временни обекта ListItem се декларират с различни имена.

lvwDrag Обектът ListItem ще задържи копието на реда, който избираме, за да плъзнем на ново място.

lvwDrop ListItem Object ще запази препратката на реда, върху който пускаме плъзгания елемент от списъка.

По време на смяната на действието ListItems, ние ще изтрием елемента Source от първоначалното му местоположение, след което ще го създадем в целевото местоположение с индексния номер на източника ListItem. Препратките на този нов ListItem се записват в lvwTarget Обектна променлива ListItem.

lvwSub Променлива, декларирана като секвенираща обектна променлива в For . . .Напред Примка. Този цикъл изисква последователност през ListSubItems (2-ра колона нататък) един по един от обекта lvwDrag. Въпреки че сме изтрили оригиналния ListItem, ние запазихме копие от него в обекта lvwDrag ListItem.

Индексният номер на lvwDrop ListItem се записва в intTgtIndex Променлива.

lvwList.HitTest(x, y) Функцията чете координатите x, y на контролата ListView и идентифицира целевия ListItem, където сме пуснали изходния ListItem и прави негово копие в lvwDrop Object.

Първо ще изберем ListItem, преди да го плъзнем на новата позиция.

lvwList.SelectedItem Свойството ще бъде зададено като True. С помощта на това състояние на свойството, ние правим копие на избрания ListItem в lvwDrag Обект на ListItem. Следващият сегмент на кода потвърждава както изходните, така и целевите обекти на ListItem.

Проверки за валидиране на действието Drag-Drop.

'Игнориране на припокриващи се действия с плъзгане или пускане на елемент, 'ИЛИ плъзгане и пускане се случва на същия ListItem. Ако (lvwDrop е нищо) Или (lvwDrag е нищо) Или (lvwDrop =lvwDrag) След това задайте lvwList.DropHighlight =нищо Задайте lvwDrop =Нищо не е зададено lvwDrag =Нищо Изход SubEnd If

Горният кодов сегмент потвърждава действието на плъзгане и пускане. Ако тези действия не са започнали или завършили на валиден елемент, тогава обектите lvwDrop или lvwDrag или и двете ще бъдат празни. Или може да се случи друго невалидно движение, когато потребителят премести ред нагоре или надолу, но може да промени решението си и да го пусне обратно на същия ред. Откриването на тези видове грешни движения ще прекрати програмата.

Ако горният тест се окаже валиден, програмата ще продължи да изпълнява следващата процедура за пренареждане на редовете.

'Запазване на изпуснатата позиция ListItem Index NumberintTgtIndex =lvwDrop.Index'Премахване на изтеглен елемент от старата му позицияlvwList.ListItems.Remove lvwDrag.Index'Създава нов елемент в позицията на целевия елемент'с изпуснатия номер и Dragg Item .Text.'Запазва новата препратка към артикула в lvwTarget Item.'* Оригиналният пусната цел) Елементът ще бъде преместен надолу'* чрез увеличаване на първоначалния набор от индексни номера lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvw)Trag. 'Копирайте поделементите на оригиналния Draged Item в новия itemIf lvwDrag.ListSubItems.Count> 0 Тогава за всеки lvwSub в lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key, lvwSub.Key. .Избрано =Вярно

Горните девет реда изпълним код (другите редове са коментари) действията са донякъде прости.

intTgtIndex =lvwDrop.Index оператор запазва индексния номер на целевия ListItem в intTgtIndex Променлива.

Тъй като вече сме запазили изходния ред listItem във временния обект lvwDrag, следващата стъпка е да премахнем изходния ListItem от контролата ListView. Процедурата ListItems.Remove() се извиква с израза lvwList.ListItems.Remove lvwDrag.Index .

Накратко, действието Drag Drop е да изтриете ListItem от първоначалното му местоположение и да го създадете отново на целевото местоположение с индексния номер на целевия ред.

Изявлението Задайте lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) създава новия ListItem с индексния номер на целевото местоположение intTgtIndex и текста стойността на Source ListItem, запазена в обекта lvwDrag по-рано.

Докато създавахме ListItem за първи път, ние използвахме само тези две стойности, индекса и Текста стойности на параметрите. Не сме използвали другите опции за параметри Ключ, Икона и SmallIcon в противен случай трябва да включим тези стойности на параметрите също от обекта lvwDrag.

Съгласно нашите примерни изображения с плъзгане, показани по-горе, преместихме 7-ия ListItem и го пуснахме върху 3-тия ListItem. След това изтрихме 7-ия елемент (или изходния ListItem) от контролата ListView. Създаден е нов ListItem с номер на целевия индекс 3.

Сега има два елемента със същия индекс номер 3, съществуващият с индекс номер 3 и новият, който създадохме с индекс номер 3. Цялата друга информация е взета от обекта lvwDrag (или 7-ия ListItem, записан в lvwDrag Обект по-рано).

Системата автоматично увеличава съществуващия ListItem 3 нататък до следващите последователни номера 3,4,5. . . до 4,5,6. . . и ги премества напред, за да даде място за вмъкване на входящия елемент между тях.

Въздействието от изтриване на ред и създаване на друго място.

Да приемем, че правим това движение в обратен ред, като плъзнете ListItem номер 3 отгоре и го пуснете върху елемент номер 7, тогава какво се случва?

Естествено, ние ще изтрием 3-тия елемент и ще се опитаме да създадем нов елемент с номер 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Стойността на Employees ID за поставянето му като улика за изместване на ListItem надолу или нагоре, когато пренаредим ListItem.

Споменах ListItem навсякъде в операциите с плъзгане и пускане. ListItem се отнася само до първата колона на реда ListView. Други стойности на колоните са ListSubItems или дъщерните елементи на ListItem. Това означава, че ще можете да плъзгате и пускате само първата колона. Други колони или ListSubItem ще бъдат преместени под ListItem с VBA код.

Това е вярно, ако не сте активирали FullRowSelection в листа със свойства на контрола ListView в Общи Раздел.

Ако е активирано, можете да изберете всяка колона, но системата препраща към индекса на ListItem за целите на пренареждането на редовете. Сравнете горните две изображения с друг набор от две примерни изображения, третото и четвъртото изображение от горната част на тази страница.

Действието плъзгане и пускане няма да работи, ако следните две стойности на свойствата не са зададени в листа със свойства на контрола ListView на Общи Раздел.:

  • ccOLEDragAutomatic =1
  • ccOLEDropManual =1

Следващите пет израза ще преместят ListSubItems, ако има такъв, към новосъздадения ListItem на новото местоположение.

След това новосъздаденият ListItem се маркира.

След това всички създадени временни обекти се изтриват от паметта.

Забележка: Друг важен момент, който трябва да се отбележи тук, е, че тази подредба е временна и се губи, когато затворите формуляра или заредите друга таблица/заявка в контролата ListView.

Ако искаме промененият ред на ListItems да остане постоянен или докато поръчката не бъде променена следващия път, тогава трябва да можем да актуализираме текущия индексиран номер на поръчка в самата таблица. Добавихме ново цяло число с идентификатора на името на полето в таблицата на служителите.

Примерният екран с данните за служителите, пренаредени по азбучен ред, е даден по-долу:

Тъй като полето Employees ID е поле AutoNumber и е свързано с други свързани таблици, ние добавихме ново поле с номер с ID на името на полето. Тази стойност на полето се задава първоначално със същите последователни номера от идентификатора на служителите ръчно. Тази стойност на полето ще бъде първоначално в този ред. Но данните на ListView Rows може да променят реда си, когато пренаредите данните в контролата ListView поради действие с плъзгане и пускане.

Вижте EmployeesQ SQL заявка, дадена по-долу:

ИЗБЕРЕТЕ [FirstName] &" " &[Lastname] AS EmployeeName, Employees.ID, Employees.EmployeeID, Employees.TitleOfCourtesy, Employees.Title, Employees.Address, Employees.City, Employees.Region Employees, EmployeesPol, Employees.Region. .Country, Employees.HomePhone, Employees.Extension, Employees.NotesFROM EmployeesORDER BY Employees.ID;

Горната заявка се използва като източник на данни за контролата ListView и те се сортират в полето ID. Полето ID се актуализира с променения ред на индексните номера на контролата ListView. Процесът на актуализиране стартира от Form_Unload() Процедура за събитие, когато затворите формуляра. Този метод гарантира, че когато отворите контролата ListView следващия път, данните ще бъдат в реда, в който сте пренаредили последния път.

Form_Unload() Процедура на събитие VBA код.

Private Sub Form_Unload(Cancel As Integer)Dim lvItem As ListItemDim tmp As LongDim критерии As StringDim strfield As StringDim fld As StringIf strTable ="" ThenSet lvwList =Nothing Exit SubEnd IfSet dbOpen CurrentDbSet(dOpen CurrentDbSet, dbOpen CurrentDbSet, dbOpen CurrentDbSet. )За всеки lvItem в lvwList.ListItems tmp =lvItem.Index strfield =lvwList.ColumnHeaders(1).Text 'EmployeeName критерии =strfield &" =" &Chr(34) &lvItem.Text &Chrst.Find критерии Ако не rst.NoMatch Тогава If (rst.Fields(strfield).Value =lvItem.Text) И (rst.Fields(1).Value =tmp) Тогава 'GoTo nextitem Else rst.Edit rst.Fields(1).Value =tmp 'заменете идентификационния номер rst.Update End Ако е друго MsgBox "Елемент:" &tmp &" Не е намерен!" Край IfNextrst.CloseSet lvwList =NothingSet lvItem =NothingSet rst =NothingSet db =NothingEnd Sub

Проверете EmployeeName Стойност на полето в горното изображение. Те са подредени по азбучен ред. Новата стойност на полето ID в таблицата на служителите ще бъде актуализирана с тяхната текуща последователност от индексни номера на ListView Control ListItem.

Ако забележите следните точки, можете лесно да разберете какво правим с горния код:

  1. Текстът на ListItem (първа колона). стойността на параметъра е името на служителя и е подредена по азбучен ред.

  2. ListItems на ListView Control има индексни номера от 1 до 9 в реда, в който се показва на екрана, т.е. индексният номер на първия елемент е 1, а последният е 9. Оригиналните данни за стойността на полето Employees Table ID не са в този ред.

  3. Вземаме Текста Стойност (Име на служител) на първия ListItem и потърсете името в таблицата.

  4. Когато записът бъде намерен, текущият индексен номер на ListItem се актуализира (заменя) в полето ID в таблицата.

  5. Този процес се повтори за всички останали записи на масата.

Нека да преминем през VBA кода. В началото проверяваме дали таблицата/заявката с изходни данни е заредена в контролата ListView или не?

Ако strTable Променливата не е инициализирана с името на заявката, тогава контролата ListView е празна. Ако случаят е такъв, тогава потребителят отваря формуляра и го затваря, без да избира името на заявката, за да зареди данните в контролата ListView. Формулярът_Разтоварване Процедурата за събитие се прекратява в този момент и затваря формуляра.

Ако контролата ListView има данни, следващата стъпка се изпълнява и се отваря заявката за изходни данни EmployeesQ за актуализиране.

Следващата стъпка е да преминете през всеки ListItem и да актуализирате номера на индекса в полето ID на записа на служителите.

Първо, текущият индекс на реда се записва в tmp Променлива.

Първото име на lvwList.ColumnHeader EmployeeName и име на служителя е взето от ListItem.Text в израз в Критериите низова променлива, като EmployeeName ="Андрю Фулър".

Критериите първи.FindFirst командата търси в таблицата с изходни данни, за да намери записа с даденото име. Когато записът бъде намерен, текущият индекс на ListItem се актуализира в полето ID.

Този процес се повтаря за всички редове на ListView Control и когато приключи, формулярът се затваря.

Следващия път, когато заредите записите от тази заявка в контролата ListView, те ще бъдат показани в същия ред, когато сте затворили формуляра последния път.

Забележка:Заявката стана необходима тук за сортиране на данните в полето ID и показването им в променения ред в контролата ListView.

Цялата тази работа беше за запазване на данните в последния сортиран ред, така че следващия път, когато отворите формуляра, данните в контролата ListView ще бъдат в този ред.

Метод за сортиране, подобен на Windows Explorer.

В Windows Explorer можете да сортирате показания списък във възходящ или низходящ ред, като щракнете върху което и да е заглавие на колона. Заглавката на колоната ще работи като бутон за превключване. Повтарящите се щраквания върху заглавката на колоната ще сортират данните на колоната във възходящ/низходящ ред по следния ListView1_ColumnClick() Процедура на събитието:

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object)' Когато се щракне върху обект ColumnHeader, контролата ListView се сортира по поделементите на тази колона. С Me.ListView1' Задайте SortKey на индекса на ColumnHeader - 1. SortKey =ColumnHeader.Index - 1 Ако .SortOrder =lvwAscending Тогава .SortOrder =lvwDescending Else .SortOrder =lvwAscending Край Ако ' Задайте Sorted на True, за да сортирате списъка. .Sorted =TrueEnd WithEnd Sub

Забележка: Сортирането на всички данни е само в режим за сравнение на текст. ListItems и ListSubItems Добавяне() третият параметър на метода, показваната информация в контролата ListView е Текст Тип. Датата и числовите стойности се третират само като текст.

Windows Explorer записва последния сортиран ред на елементи в папката. Когато отворим тази папка отново, списъкът ще се покаже в по-ранния сортиран ред.

С Form_Unload() Процедура за събитие Тази функция на Windows Explorer става възможна в таблицата на служителите. Когато затворите формуляра след сортиране на която и да е колона, тази индексирана последователност от поръчки ще бъде запазена в таблицата на служителите в полето ID. Заявката EmployeesQ винаги сортира данните в полето ID, когато се отвори.

Демо базата данни е приложена за изтегляне. В базата данни има два демо формуляра. Първият формуляр демонстрира отварянето на таблици и заявки в контролата ListView за преглед на данните в изглед на лист с данни. Вторият формуляр използва само EmployeesQ Само заявка за плъзгане, пускане, сортиране и запазване на последния ред на сортиране на данните за бъдеща употреба.



  1. Урок за управление на ActiveX ListView-01.
  2. Урок за управление на ListView-02.
  3. Присвояване на изображения към елементи на ListView.
  4. ListView Control Drag-Drop Sort Events
  5. Управление на ListView с MS-Access TreeView
  6. TreeView/ListView управлява събития с плъзгане

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 работни места, които изискват Microsoft Access

  2. Четири често срещани мита за облачните технологии

  3. Как да показвате скрити елементи в браузъра на VBA обекти

  4. Защо първичните ключове са важни и как да изберем един

  5. Безплатна база данни за полеви болници за борба с пандемията COVID-19