sql >> Databáze >  >> RDS >> Access

Výukový program ovládání ListView-02

Úvod.

Pokračování z minulého týdne výukového programu ovládacího prvku ActiveX ListView-01.

V této relaci výukového programu se naučíme, jak hledat a najít konkrétní hodnoty řádků a sloupců a zobrazovat je v ovládacím prvku Label na formuláři. To je velmi užitečné, když máme v ovládacím prvku ListView velký objem dat. Také se naučíme používat některá nastavení vlastností ListView.

Nejprve uvidíme, jak snadné je změnit uspořádání sloupců, jako to děláme s Access Datasheet View tak, jak chceme, aby byly v ovládacím prvku ListView. Pro snadnější výběr parametrů vyhledávání a zobrazení výsledků vyhledávání jsme přidali některá textová pole, ComboBox, příkazová tlačítka a štítek.

Udělal jsem nějaké změny v demo datech z minulého týdne. Hodnoty prvního sloupce jsem převzal z tabulky zaměstnanců ukázkové databáze Northwind.accdb. Vytvořil dotaz pro spojení hodnot Příjmení a Jméno s názvem pole Student a ID zaměstnance použitým jako klíč (X01, X02 ...).

Než se pustíme do vyhledávacích operací, zkontrolujeme, jak přeuspořádat sloupce metodou přetažení.

Poznámka: Pokud jste neprošli předchozí výukovou stránku a chtěli byste v této relaci pokračovat, přejděte na stránku ListView Control Tutorial-01 a stáhněte si demo databázi ze spodní části této stránky.

Rozbalte soubor a otevřete databázi. Ukázkový formulář bude v normálním zobrazení.

  1. Otevřete svou databázi s ukázkovým formulářem poslední relace nebo formulářem, který jste vytvořili, otevřete jej v normálním zobrazení.

    Nyní se pokusíme přetáhnout a přesunout sloupec ze středu seznamu (řekněme sloupec Hmotnost) a pustit jej do Věk sloupec a uvidíte, co se stane. Očekává se, že se stane, že sloupec Věk by se měl posunout doprava a na jeho místo vložit příchozí sloupec.

  2. Přesuňte ukazatel myši na záhlaví sloupce s názvem Hmotnost klikněte a podržte levé tlačítko myši. Když stisknete levé tlačítko myši, záhlaví sloupce se posune mírně dolů.

  3. Nyní zkuste přetáhnout sloupec doleva a umístit jej na sloupec Věk .

    Nic se nestane, protože jsme tuto funkci v listu vlastností nepovolili a to je jediné nastavení, které musíme změnit, aby tato funkce fungovala.

  4. Změňte formulář v návrhovém zobrazení.

  5. Klepněte pravým tlačítkem myši na ovládací prvek ListView a zvýrazněte možnost Objekt ListViewCtrl a vyberte Vlastnosti.

  6. Je zde možnost 'AllowColumnReorder ' na pravé straně. Označte jej zaškrtnutím a poté klikněte na Použít a poté OK zavřete zobrazení vlastností.

  7. Nyní zkuste zopakovat výše uvedené kroky 2 a 3 a uvidíte, co se stane.

    To je jediné nastavení, které potřebujete k aktivaci této funkce v ListView Control. Možná si říkáte, co takhle přeskupit řádky?.

    Tato funkce vyžaduje naprogramování některých procedur událostí, jak jsme to udělali dříve v případě událostí přetažením ovládacího prvku TreeView. Tuto část uděláme po nějaké době.

  8. Můžete experimentovat s libovolným sloupcem a pohybovat se kamkoli chcete, včetně prvního sloupce.

Poznámka: Než zdrojový sloupec zrušíte, zkontrolujte, zda je cílový sloupec zakrytý rámcem příchozího sloupce, než se pokusíte vypustit. V opačném případě se příchozí sloupec může posunout na další pozici sloupce na pravé straně.

Dále se naučíme, jak rychle najít nějaké informace z ListView za předpokladu, že v něm máme velký objem dat.

Do modulu Tutorial-01 jsme přidali podprogram pro načtení názvů záhlaví sloupců do Combo Boxu ve formuláři s červenou barvou pozadí. Název sloupce se použije k nalezení hodnoty sloupce (Věk, Výška, Váha nebo Třída) studenta.

Do modulu Form Class přidán nový kód VBA.

Následující nová procedura VBA je přidána do modulu třídy výukového formuláře z minulého týdne:

txtColCombo vytvoří seznam štítků záhlaví sloupců (názvů polí) v ComboBoxu. Jedna z těchto podrobností o studentově věku, výšce, hmotnosti nebo Třída lze nalézt spolu se jménem studenta v rámci operace hledej a najdi.

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

Do Comboboxu nebude načtena výchozí hodnota Název záhlaví sloupce. Pokud je tato možnost vybrána, hodnota sloupce studenta se zobrazí ve velkém štítku pod jménem studenta. Pokud je ponecháno prázdné, operace vyhledávání najde pouze jméno studenta.

Metoda vyhledávací operace je velmi flexibilní a rychlá. Máme dva způsoby, jak najít záznam.

Najděte záznam zadáním hledaného textu. Hledaný text může být z libovolného sloupce buď celý text nebo částečný text s několika málo znaky zleva. Protože v ovládacím prvku ListView máme dvě kategorie členů objektů v řadě:ListItem - první sloupec a další sloupce jsou ListSubItems. Operace vyhledávání textu na těchto objektech se provádí samostatně.

Skupina možností se dvěma zaškrtávacími políčky je k dispozici vedle textového pole pro zadání vyhledávacího textu ve formuláři pro výběr možností hledání a hledání. Ve výchozím nastavení je vybrána první možnost a vyhledávání se provádí v prvním sloupci (ListItem ) vyhledejte daný text.

Vyberte druhou možnost pro vyhledávání textu v ListSubItem sloupce.

Poznámka: Přeuspořádáním sloupců se nezmění objekty, ale pouze jejich pozice zobrazení. Přetažení položky ListSubItem a uvedení do prvního sloupce se nezmění do Položky seznamu objekt.

Pokud chcete načíst neznámou hodnotu z určitého sloupce, vyberte název sloupce z ComboBoxu uvedeného pod prvním textovým polem ve formuláři pro hledaný text. Například neznáte měření výšky studenta a chtěli byste to zjistit, vyberte název sloupce Výška z ComboBoxu.

Po nastavení výše uvedených hodnot klikněte na Najít položku Příkazové tlačítko pro přechod na operaci vyhledávání. Pokud bylo vyhledávání úspěšné, zobrazí se výsledek ve velkém ovládacím prvku Label pod příkazovým tlačítkem.

Klikněte na příkazové tlačítko [Najít položku].

Volá SearchAndFind() Postup.

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

Na začátku programu Jméno studenta a Název sloupce ( 0nepovinné), jsou zkopírovány z textových polí do proměnných strFind a strColName respektive po validačních kontrolách.

Poznámka: Vlastnost pole se seznamem s názvem sloupce Not-in-List je nastavena na Ano. Můžete vybrat platnou hodnotu ze seznamu nebo ji zadat nebo ponechat pole se seznamem prázdné. Pokud zadáte jinou hodnotu, která není v seznamu, nebude přijata.

Na základě vybrané možnosti vyhledávání (1 - ListItem nebo 2 - ListSubItem) je metoda skenování nasměrována na zadaný objekt(y).

Pomocí jedné z těchto vyhledávacích metod najdete Objekt ListItem nebo řádek který obsahuje hledaný text. Hodnota indexu položky ListItem je uložena v proměnné J pro pozdější použití v programu.

Poznámka: Systém automaticky vytvoří indexová automatická čísla v době, kdy jsou zaplněny ovládací prvky ListView.

ListItem.Text hodnota se načte. Tyto informace jsou spojeny s prvním záhlavím ColumnHeader. Text (jako Student:Robert King) a přidaný do řetězce Msgtext, aby se zobrazil v ovládacím prvku Label na formuláři.

Pokud je v ComboBoxu vybrán sloupec Název záhlaví, pak GetColVal() Funkce se volá s objektem ListItem a hodnotou Text záhlaví sloupce jako parametry. Tato možnost je vhodná pro získávání neznámých informací o studentovi, jako je výška studenta, ze záznamu.

Kód VBA funkce 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

Výše uvedená funkce vyžaduje dva parametry. Prvním parametrem je ListItem, kde se nachází jméno studenta. Druhým parametrem je Název sloupce. Věk, výška, váha, třída vybraného studenta hodnoty jsou uloženy v ListItem.ListSubItems Objekty. Funkce prohlíží lvwList.ColumnHeader hodnoty k nalezení odpovídajícího názvu sloupce, když se zjistí, že indexové číslo sloupce se používá k načtení hodnoty sloupce z objektu ListSubItems a vrátí hodnotu volajícímu programu.

Příkazové tlačítko [Najít podle klíče] Klikněte na událost.

Přidali jsme další metodu k nalezení jména studenta pomocí jedinečné hodnoty klíče ListItem pokud se použije při vytváření seznamu ListItem List. I když je to volitelné, je lepší přidat hodnotu Unique Key String Value (měla by začínat znakem abecedy), než ji ignorovat.

Pokud například musíme najít něčí informace podle jejich identifikačního čísla, jako je číslo sociálního zabezpečení, číslo občanského průkazu, číslo pasu nebo číslo řidičského průkazu a tak dále, jednu z těchto informací lze použít jako hodnotu klíče pro položku ListItem. Nalezení záznamu s touto jedinečnou hodnotou je velmi snadné a rychlejší než výše uvedená metoda vyhledávání podle textu.

Procedura události 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

Jak můžete vidět ve výše uvedeném podprogramu, můžeme přímo najít ListItem kde je jméno studenta, s použitím páru klíč-hodnota, s jediným příkazem:Nastavte lvItem =lvwList.ListItems.Item(xKeyVal).

Další řádek přečte text ListItem (nebo jméno studenta) do proměnné txt . Další dva řádky vytvoří text zprávy se jménem studenta v řetězcové proměnné msgText.

Další Pokud . . .Pak příkaz zkontroluje, zda je v ovládacím prvku pole se seznamem zadána hodnota názvu sloupce. Pokud je nalezen, zavolá GetColVal() Funkce s požadovanými parametry k nalezení hodnoty sloupce a jejímu načtení v varColVal Proměnná a vrátí se do volajícího programu. Název sloupce a jeho načtená hodnota jsou přidány do proměnné řetězce msgText, aby se zobrazily v ovládacím prvku Label ve formuláři.

Další příkaz zvýrazní záznam Řádek studenta jako vizuální indikaci, že hledaná položka je v řádku nalezena. Hodnota msgText je zobrazena ve vlastnosti Caption Label na formuláři.

Úplný kód VBA na modulu formuláře.

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

Stáhněte si ukázkovou databázi z následujícího odkazu:



  1. Výukový program pro ovládání Microsoft TreeView
  2. Vytvoření přístupové nabídky pomocí TreeView Control
  3. Přiřazení obrázků k uzlům TreeView
  4. Přiřazení obrázků k uzlům TreeView-2
  5. Ovládací prvek TreeView Zaškrtávací políčko Přidat Odstranit
  6. Rozbalovací přístup TreeView ImageCombo
  7. Změňte uspořádání uzlů TreeView přetažením
  8. Ovládání ListView s MS-Access TreeView
  9. Události přetažení ovládacího prvku ListView
  10. Ovládání stromu pomocí podformulářů

  1. Python:Dotazování na data zvukem

  2. Tipy a triky pro navigaci v komunitě PostgreSQL

  3. Pomocí sys.trigger_event_types vypište typy událostí spouštění na serveru SQL Server

  4. Postgres analogie k CROSS APPLY na SQL Server