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

Урок за управление на ListView-02

Въведение.

Продължение от миналата седмица ActiveX ListView Control Tutorial-01.

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

На първо място, ще видим колко лесно е да пренаредите колоните, както правим с Access Datasheet View по начина, по който искаме да бъдат в контролата ListView. Добавихме някои текстови полета, ComboBox, командни бутони и етикет за по-лесен избор на параметри за търсене и показване на резултатите от търсенето.

Направих някои промени в демонстрационните данни от миналата седмица. Първите стойности на колоната, които взех от таблицата на служителите на примерната база данни Northwind.accdb. Създаде заявка за присъединяване на стойностите на фамилното и собственото име с името на полето Student и EmployeeID, използвани като ключ (X01, X02 ...).

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

Забележка: Ако не сте преминали през по-ранната страница с урок и искате да продължите с тази сесия, след това отидете на страницата ListView Control Tutorial-01 и изтеглете демонстрационната база данни от долната част на тази страница.

Разархивирайте файла и отворете базата данни. Демонстрационният формуляр ще бъде в нормален изглед.

  1. Отворете своята база данни с демонстрационния формуляр от последната сесия или формуляра, който сте създали, отворете го в нормален изглед.

    Сега ще се опитаме да плъзнем и преместим колона от средата на списъка (да речем колоната Тегло) и да я пуснем в Възраст колона и вижте какво ще се случи. Това, което се очаква да се случи, е колоната „Възраст“ да се измести надясно и да вмъкне входящата колона на нейно място.

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

  3. Сега опитайте да плъзнете колоната наляво и да я пуснете върху колоната Възраст .

    Нищо няма да се случи, тъй като не сме активирали тази функция в листа със свойства и това е единствената настройка, която трябва да променим, за да работи тази функция.

  4. Променете формуляра в Design View.

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

  6. Има опция „AllowColumnReorder ' от дясната страна. Поставете отметка, за да го изберете, след което щракнете върху Прилагане бутон, последван от OK бутон, за да затворите изгледа на свойствата.

  7. Сега опитайте да повторите горните стъпки 2 и 3 по-горе и вижте какво ще се случи.

    Това е единствената настройка, от която се нуждаете, за да активирате тази функция в контролата ListView. Може би си мислите, какво ще кажете за пренареждането на редовете?.

    Тази функция се нуждае от програмиране на някои процедури за събития, както направихме по-рано в TreeView Control Drag-Drop Events. Тази част ще направим след известно време.

  8. Можете да експериментирате с всяка колона, за да се движите където пожелаете, включително и първата колона.

Забележка: Преди да пуснете колоната източник, вижте, че целевата колона е покрита от рамката на входящата колона, преди да се опитате да изпуснете. В противен случай входящата колона може да се измести към следващата колона от дясната страна.

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

Добавихме подпрограма към модула Tutorial-01 за зареждане на имената на заглавките на колони в Combo Box във формуляра с червения цвят на фона. Името на колоната ще се използва за намиране на стойността на колоната (възраст, височина, тегло или клас) на ученик.

Нов VBA код, добавен към модула за клас на формуляра.

Следната нова VBA процедура е добавена към модула за клас на формуляра за урок от миналата седмица:

txtColCombo създава списък с етикети за заглавки на колони (имена на полета) в ComboBox. Една от тези подробности за възраст, ръст, тегло на ученика или Клас може да бъде намерен заедно с името на ученика като част от операцията за търсене и намиране.

Private Sub txtColCombo()
'Column Header List Combo
Dim lvwColHead As MSComctlLib.ColumnHeader
Dim cboName As ComboBox

Set cboName = Me.txtCol
cboName.RowSourceType = "Value List"

For Each lvwColHead In lvwList.ColumnHeaders
    If lvwColHead.Index = 1 Then
        'Nothing
    Else
        cboName.AddItem lvwColHead.Text
    End If
Next
'cboName.DefaultValue = "=txtCol.Column(0, 0)"

Set lvwColHead = Nothing
Set cboName = Nothing
End Sub

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

Методът на операцията за търсене е много гъвкав и бърз. Имаме два метода да намерим запис.

Намерете записа, като предоставите текста за търсене. Текстът за търсене може да бъде от всяка от колоните или текстът изцяло или частично няколко знака отляво. Тъй като имаме две категории членове на обекта в ред в контролата ListView:ListItem - първата колона и другите колони са ListSubItems. Операцията за търсене на текст върху тези обекти се извършва отделно.

Група опции с две квадратчета за отметка е предоставена до текстовото поле за въвеждане на текст за търсене във формуляра, за да изберете опциите за търсене и намиране. Първата опция е избрана по подразбиране и търсенето се извършва в първата колона (ListItem ), за да потърсите дадения текст.

Изберете втората опция, за да търсите текста в ListSubItem колони.

Забележка: Пренареждането на колоните няма да промени обектите, а само позицията им на показване. Плъзгане на ListSubItem колона и привеждането й в първата колона няма да се промени в ListItem обект.

Ако искате да извлечете неизвестна стойност от конкретна колона, изберете име на колона от ComboBox, дадено под първото TextBox във формуляра за текста за търсене. Например, не знаете измерването на височината на ученик и искате да разберете, изберете името на колоната Височина от ComboBox.

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

Щракнете върху командния бутон [Намиране на елемент].

Извиква SearchAndFind() Процедура.

Private Sub SearchAndFind()
'Find by Student Name
Dim lstItem As MSComctlLib.ListItem
Dim strFind As String
Dim strColName As String
Dim strColVal As String
Dim j As Integer
Dim intOpt As Integer
Dim msgText As String

Me.Refresh
intOpt = Me.Opts


strFind = Nz(Me![txtFind], "")
strColName = Nz(Me![txtCol], "")

Select Case intOpt
    Case 1
        Set lstItem = lvwList.FindItem(strFind, , , lvwPartial)
    
        If Not lstItem Is Nothing Then
            j = lstItem.Index
            'format the display text
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & " : " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox "Text '" & strFind & "' Not Found!", vbOKOnly + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
    Case 2
        Set lstItem = lvwList.FindItem(strFind, lvwSubItem, , lvwPartial)
        If Not lstItem Is Nothing Then
       'format the display text
            j = lstItem.Index
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & ": " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox strFind & " Not Found!", vbOK + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
End Select

        If Len(strColName) = 0 Then 'If column name is not selected
            GoTo nextStep
        Else
            'Get the column value
            strColVal = GetColVal(lstItem, strColName)
            msgText = msgText & String(8 - (Len(strColName)), " ") & _
            strColName & ": " & Nz(strColVal, "")
        End If
nextStep:

If Len(msgText) > 0 Then 'assign to form label
    lvwList.ListItems.Item(j).Selected = True
    lblMsg.caption = msgText
End If

End Sub

В началото на програмата и двете Име на ученик и Име на колона ( 0задължителен), се копират от текстовите полета в променливите strFind и strColName съответно след проверки за валидиране.

Забележка: Името на колоната Combo Box's Not-in-List Property е зададено на Да. Можете да изберете валидна стойност от списъка или да я въведете или да оставите комбинираното поле празно. Ако въведете друга стойност, която не е в списъка, тя няма да бъде приета.

Въз основа на избраната опция за търсене (1 - ListItem или 2 - ListSubItem) методът на сканиране се насочва към посочения(и) обект(и).

Използването на един от тези методи за търсене ще намери ListItem Object или ред който съдържа текста за търсене. Стойността на индекса на ListItem се записва в променлива J за по-късно използване в програмата.

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

ListItem.Text стойността се извлича. Тази информация се съединява с първия колонен заглавие. Текст (като Студент:Робърт Кинг) и добавен в низа Msgtext за показване в контролата Label във формуляра.

Ако името на заглавката на колоната е избрано в ComboBox, тогава GetColVal() Функцията се извиква с обекта ListItem и стойността на текста на заглавката на колона като параметри. Тази опция е добра за извличане на неизвестна информация за ученик, като височината на ученика, от записа.

VBA кодът на функцията GetColVal().

Private Function GetColVal(lvwItem As MSComctlLib.ListItem, ByVal colName As String) As String
Dim i As Integer
Dim strVal As String
    'first column is student name
    'check for column value from 2nd column onwards
    For i = 2 To lvwList.ColumnHeaders.Count
        If lvwList.ColumnHeaders(i).Text = colName Then 'if col name matches
            strVal = lvwItem.ListSubItems.Item(i - 1).Text 'get column value
            Exit For 'No further scanning required
        End If
    Next
GetColVal = strVal 'return the retrieved the value
End Function

Горната функция изисква два параметъра. Първият параметър е ListItem, където се намира името на ученика. Вторият параметър е името на колоната. Възраст, височина, тегло, клас на избрания ученик стойностите се съхраняват в ListItem.ListSubItems Обекти. Функцията преглежда lvwList.ColumnHeader стойности за намиране на съответстващото име на колона, когато се установи, че индексният номер на колоната се използва за извличане на стойност на колоната от обекта ListSubItems и връща стойността на извикващата програма.

Командният бутон [Намиране по ключ] Щракнете върху Процедура за събитие.

Имаме добавен друг метод за намиране на името на ученика с помощта на уникалния ключ-стойност на ListItem ако се използва при създаване на ListItem List. Въпреки че е по избор, по-добре е да добавите уникален ключов низ стойност (трябва да започва с азбучен знак), вместо да го игнорирате.

Например, ако трябва да намерим нечия информация по техния идентификационен номер като социалноосигурителен номер, номер на национална лична карта, номер на паспорт или номер на шофьорска книжка и т.н., една от тази информация може да се използва като стойност на ключа към ListItem. Намирането на запис с тази уникална стойност е много лесно и по-бързо, отколкото горния метод за търсене по текст.

Процедурата за събитие cmdKey_Click().

Calls FindByKey() Subroutine.
Private Sub FindByKey()
Dim colHeader As MSComctlLib.ColumnHeader
Dim lvItem As MSComctlLib.ListItem
Dim lvKeyVal As String
Dim lvColName As String
Dim txt As String
Dim msgText As String
Dim varcolVal As Variant

lvKeyVal = UCase(Nz(Me!txtKey, ""))
lvColName = Nz(Me!txtCol, "")

If len(lvKeyVal) > 0 then
On Error Resume Next 
Set lvItem = lvwList.ListItems.Item(lvKeyVal) 'get the item by Key
If Err > 0 Then
    Err.Clear
    MsgBox "Key Value: '" & lvKeyVal & "' Not Found!", vbOKOnly + vbCritical, "cmdKey_Click()"
    On Error GoTo 0
    Exit Sub
End If
Else
	MsgBox "Please Provide a Valid Key-Value!",vbOKOnly + vbCritical, "cmdKey_Click()"
    Exit Sub
End If

txt = lvItem.Text 'get the student name
'format message text
msgText = lvwList.ColumnHeaders.Item(1).Text & " : "
msgText = msgText & txt & vbCr & vbCrLf

If Len(lvColName) > 0 Then 'if column name is given
    varcolVal = GetColVal(lvItem, lvColName) 'get column val of student
    msgText = msgText & String(8 - Len(lvColName), " ") & lvColName & ": " & varcolVal ' add it to display
End If

lvItem.Selected = True 'highlight the item on form
Me.lblMsg.caption = msgText 'assign details to form Label
End Sub

Както можете да видите в горната подпрограма, можем директно да намерим ListItem където е името на ученика, с помощта на ключ-стойност, с едно изявление:Задайте lvItem =lvwList.ListItems.Item(xKeyVal).

Следващият ред чете текста на ListItem (или името на ученика) в променливата txt . Следващите два реда създават текста на съобщението с името на ученика в низовата променлива msgText.

Следващият Ако . . .След това оператор проверява дали стойността на име на колона е въведена в контролата на комбинираното поле. Ако бъде намерен, тогава извиква GetColVal() Функция с необходимите параметри, за да намерите стойността на колоната и да я извлечете в varColVal Променлива и се връща към извикващата програма. Името на колоната и извлечената й стойност се добавят към низовата променлива msgText, за да се покажат в контролата Label във формуляра.

Следващото твърдение подчертава записа Ред на ученика като визуална индикация, че търсеният елемент е намерен в реда. Стойността msgText се показва в свойството Caption на етикета във формуляра.

Пълният VBA код на модула на формуляра.

Option Compare Database
Option Explicit

Dim lvwList As MSComctlLib.ListView 'ListView Control
Dim lvwItem As MSComctlLib.ListItem '
Dim ObjImgList As MSComctlLib.ImageList
Const prfx As String = "K"

Private Sub Form_Load()
    Call LoadListView
    Call txtColCombo
End Sub

Private Function LoadListView()
'Populate the ListView control with Student Details
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim intCounter As Integer
Dim strKey As String

'Assign ListView Control on Form to lvwList Object
 Set lvwList = Me.ListView1.Object
 
With lvwList
    .AllowColumnReorder = True
    .Enabled = True
    .Font = "Verdana"
    .Font.Bold = True
    .Font.Size = 9
    .ForeColor = vbBlack
    .BackColor = vbWhite
 End With
 
 'Create Column Headers for ListView
 With lvwList
    .ColumnHeaders.Clear 'initialize header area
    
   'Syntax: .ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
    .ColumnHeaders.Add , , "Student", 2500
    .ColumnHeaders.Add , , "Age", 1200
    .ColumnHeaders.Add , , "Height", 1200
    .ColumnHeaders.Add , , "weight", 1200
    .ColumnHeaders.Add , , "Class", 1200
    
 End With
 
 'Initialize ListView Control
  While lvwList.ListItems.Count > 0
        lvwList.ListItems.Remove (1)
  Wend

'Student Names and Ids are taken from Employees Table
'through the StudentQ Query.
Set db = CurrentDb
Set rst = db.OpenRecordset("StudentQ", dbOpenDynaset)

With lvwList
    Do While Not rst.EOF And Not rst.BOF
        intCounter = rst![EmployeeID]
        strKey = "X" & Format(intCounter, "00") 'Key Value sample: X01
        
    'Syntax: .ListItems.Add(Index, Key, Text, Icon, SmallIcon)
        Set lvwItem = .ListItems.Add(, strKey, rst![Student])
        
        With lvwItem
    'Syntax: .Add Index,Key,Text,Report Icon,TooltipText
            .ListSubItems.Add , strKey & CStr(intCounter), CStr(5 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 1), CStr(135 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 2), CStr(40 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 3), ("Class:" & Format(intCounter, "00"))

       End With
        rst.MoveNext
    Loop
rst.Close
Set rst = Nothing
Set db = Nothing
Set lvwItem = Nothing
End With
lvwList.Refresh

End Function


Private Sub cmdClose_Click()
   DoCmd.Close acForm, Me.Name
End Sub

Private Sub cmdFind_Click()
Call SearchAndFind

End Sub

Private Sub cmdKey_Click()
Call FindByKey
End Sub

Private Function GetColVal(lvwItem As MSComctlLib.ListItem, ByVal colName As String) As String
Dim i As Integer
Dim strVal As String
    'first column is student name
    'check for column value from 2nd column onwards
    For i = 2 To lvwList.ColumnHeaders.Count
        If lvwList.ColumnHeaders(i).Text = colName Then 'if col name matches
            strVal = lvwItem.ListSubItems.Item(i - 1).Text 'get column value
            Exit For 'No further scanning required
        End If
    Next
GetColVal = strVal 'return the retrieved the value
End Function



Private Sub txtColCombo()
'Column Header List Combo
Dim lvwColHead As MSComctlLib.ColumnHeader
Dim cboName As ComboBox

Set cboName = Me.txtCol
cboName.RowSourceType = "Value List"

For Each lvwColHead In lvwList.ColumnHeaders
    If lvwColHead.Index = 1 Then
        'Nothing
    Else
        cboName.AddItem lvwColHead.Text
    End If
Next
'cboName.DefaultValue = "=txtCol.Column(0, 0)"

Set lvwColHead = Nothing
Set cboName = Nothing
End Sub


Public Sub SearchAndFind()
'Find by Student Name
Dim lstItem As MSComctlLib.ListItem
Dim strFind As String
Dim strColName As String
Dim strColVal As String
Dim j As Integer
Dim intOpt As Integer
Dim msgText As String

Me.Refresh
intOpt = Me.Opts

strFind = Nz(Me![txtFind], "")
strColName = Nz(Me![txtCol], "")

Select Case intOpt
    Case 1
        Set lstItem = lvwList.FindItem(strFind, , , lvwPartial)
        If Not lstItem Is Nothing Then
            j = lstItem.Index
            'format the display text
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & " : " & lstItem.Text & vbCr & vbCrLf
        Else
           MsgBox "Text '" & strFind & "' Not Found in the List!", vbOKOnly + vbCritical, "cmdFind_Click()"
        Exit Sub
        End If
    Case 2
        Set lstItem = lvwList.FindItem(strFind, lvwSubItem, , lvwPartial)
        If Not lstItem Is Nothing Then
       'format the display text
            j = lstItem.Index
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & ": " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox strFind & " Not Found!", vbOK + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
End Select

        If Len(strColName) = 0 Then 'If column name is not selected
            GoTo nextStep
        Else
            'Get the column value
            strColVal = GetColVal(lstItem, strColName)
            msgText = msgText & String(8 - (Len(strColName)), " ") & _
            strColName & ": " & Nz(strColVal, "")
        End If
nextStep:

If Len(msgText) > 0 Then 'assign to form label
    lblMsg.caption = msgText
    lvwList.ListItems.Item(j).Selected = True
End If
End Sub

Public Sub FindByKey()
Dim colHeader As MSComctlLib.ColumnHeader
Dim lvItem As MSComctlLib.ListItem
Dim lvKeyVal As String
Dim lvColName As String
Dim txt As String
Dim msgText As String
Dim varcolVal As Variant


lvKeyVal = UCase(Nz(Me!txtKey, ""))
lvColName = Nz(Me!txtCol, "")

On Error Resume Next
If Len(lvKeyVal) > 0 Then
Set lvItem = lvwList.ListItems.Item(lvKeyVal) 'get the item by Key
    If Err > 0 Then
        Err.Clear
        MsgBox "Key Value: '" & lvKeyVal & "' Not Found!", vbOKOnly + vbCritical, "cmdKey_Click()"
       On Error GoTo 0
        Exit Sub
    End If
Else
    MsgBox "Please Provide a Valid Key-Value!", vbOKOnly + vbCritical, "cmdKey_Click()"
    Exit Sub
End If

txt = lvItem.Text 'get the student name
'format message text
msgText = lvwList.ColumnHeaders.Item(1).Text & " : "
msgText = msgText & txt & vbCr & vbCrLf

If Len(lvColName) > 0 Then 'if column name is given
    varcolVal = GetColVal(lvItem, lvColName) 'get column val of student
    msgText = msgText & String(8 - Len(lvColName), " ") & lvColName & ": " & varcolVal ' add it to display
End If

lvItem.Selected = True 'highlight the item on form
Me.lblMsg.caption = msgText 'assign details to form Label
End Sub

Изтеглете Демо базата данни от следната връзка:



  1. Урок за контрол на Microsoft TreeView
  2. Създаване на меню за достъп с TreeView Control
  3. Присвояване на изображения към възлите на TreeView
  4. Присвояване на изображения на TreeView възли-2
  5. TreeView Control Отметка Добавяне Изтриване
  6. DreeView ImageCombo падащ достъп
  7. Пренаредете възлите на TreeView чрез плъзгане и пускане
  8. ListView Control с MS-Access TreeView
  9. ListView Control Drag Drop Events
  10. Управление на TreeView с подформуляри

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизиране на Microsoft Access със SQL Server IndyPass – 21.05.19

  2. Access 2016 For Dummies Cheat Sheet

  3. 5 грешки в дизайна на база данни, които трябва да избягвате

  4. Писане на четим код за VBA – Опитайте* шаблон

  5. Базов клас на MS-Access и производни обекти