Access
 sql >> Database >  >> RDS >> Access

Esercitazione sul controllo ListView-02

Introduzione.

Continua da ActiveX ListView Control Tutorial-01 della scorsa settimana.

In questa sessione del Tutorial, impareremo come cercare e trovare i valori di riga e colonna particolari e visualizzarli su un controllo etichetta su modulo. Questo è molto utile quando abbiamo un grande volume di dati nel controllo ListView. Impareremo anche l'utilizzo di alcune impostazioni delle proprietà ListView.

Prima di tutto, vedremo quanto è facile riorganizzare le colonne, come facciamo con Access Datasheet View nel modo in cui vogliamo che siano sul controllo ListView. Abbiamo aggiunto alcune caselle di testo, caselle combinate, pulsanti di comando ed etichette per semplificare la selezione dei parametri di ricerca e la visualizzazione dei risultati della ricerca.

Ho apportato alcune modifiche ai dati demo della scorsa settimana. I valori della prima colonna che ho preso dalla tabella dei dipendenti del database di esempio Northwind.accdb. Creata una query per unire i valori LastName e FirstName con il nome del campo Student e EmployeeID utilizzati come chiave (X01, X02 ...).

Prima di passare alle operazioni di ricerca, verificheremo come riordinare le colonne con il metodo drag and drop.

Nota: Se non hai esaminato la precedente Pagina Tutorial e desideri continuare con questa sessione, vai alla Pagina ListView Control Tutorial-01 e scarica il database demo dalla parte inferiore di quella Pagina.

Decomprimi il file e apri il database. Il modulo demo sarà in visualizzazione normale.

  1. Apri il tuo Database, con il Modulo Demo dell'ultima sessione, o il Modulo che hai creato, aprilo in Visualizzazione Normale.

    Ora proveremo a trascinare e spostare una colonna dal centro dell'elenco (ad esempio la colonna Peso) e rilasciarla sull'Età colonna e guarda cosa succede. Ciò che dovrebbe accadere è che la colonna Età si sposti a destra e inserisca la colonna in entrata al suo posto.

  2. Sposta il puntatore del mouse sull'intestazione della colonna con il nome Peso fare clic e tenere premuto il tasto sinistro del mouse. Quando premi il pulsante sinistro del mouse, l'intestazione della colonna si sposterà leggermente in basso.

  3. Ora prova a trascinare la colonna a sinistra e rilasciarla sulla colonna Età .

    Non accadrà nulla, perché non abbiamo abilitato questa funzione nella scheda delle proprietà e questa è l'unica impostazione, dobbiamo cambiare affinché questa funzione funzioni.

  4. Modifica il modulo in Visualizzazione struttura.

  5. Fare clic con il pulsante destro del mouse sul controllo ListView ed evidenziare l'opzione ListViewCtrl Object e seleziona Proprietà.

  6. C'è un'opzione 'AllowColumnReorder ' dal lato giusto. Metti il ​​segno di spunta per selezionarlo, quindi fai clic su Applica pulsante seguito da OK per chiudere la Visualizzazione proprietà.

  7. Ora, prova a ripetere i passaggi 2 e 3 precedenti e guarda cosa succede.

    Questa è l'unica impostazione necessaria per abilitare questa funzione nel controllo ListView. Forse starai pensando, che ne dici di riorganizzare le file?.

    Tale funzione richiede la programmazione di alcune procedure di evento come abbiamo fatto in precedenza in TreeView Control Drag-Drop Events. Quella parte che faremo dopo un po' di tempo.

  8. Puoi sperimentare con qualsiasi colonna per spostarti dove preferisci, inclusa anche la prima colonna.

Nota: Prima di eliminare la colonna di origine, verificare che la colonna di destinazione sia coperta dal frame della colonna in ingresso prima di tentare di eliminare. In caso contrario, la colonna in entrata potrebbe spostarsi nella posizione della colonna successiva sul lato destro.

Successivamente, impareremo come trovare rapidamente alcune informazioni da ListView, supponendo di avere un grande volume di dati in esso.

Abbiamo aggiunto una subroutine al modulo Tutorial-01 per caricare i nomi delle intestazioni delle colonne in una casella combinata sul modulo con il colore di sfondo rosso. Il nome della colonna verrà utilizzato per trovare il valore della colonna (Età, Altezza, Peso o Classe) di uno studente.

Nuovo codice VBA aggiunto al modulo classe modulo.

La seguente nuova procedura VBA è stata aggiunta al modulo di classe del modulo tutorial della scorsa settimana:

Il txtColCombo crea l'elenco di etichette di intestazione di colonna (nomi di campo) nel ComboBox. Uno di questi dettagli dell'Età, Altezza, Peso dello Studente o Classe può essere trovato insieme al nome dello studente come parte dell'operazione di ricerca e trova.

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

La casella combinata non verrà caricata con un valore predefinito di Nome intestazione colonna. Se selezionato, il valore della colonna dello Studente viene visualizzato nell'etichetta grande sotto il nome dello studente. Se viene lasciato vuoto, l'operazione di ricerca troverà solo il nome dello studente.

Il metodo dell'operazione di ricerca è molto flessibile e veloce. Abbiamo due metodi per trovare un record.

Trova il record fornendo il testo di ricerca. Il testo di ricerca può provenire da una qualsiasi delle colonne sia il testo completo o parziale pochi caratteri da sinistra. Poiché abbiamo due categorie di membri di oggetti in una riga nel controllo ListView:ListItem - la prima colonna e le altre colonne sono ListSubItems. L'operazione di ricerca del testo su questi oggetti viene eseguita separatamente.

Accanto alla casella di testo di input del testo di ricerca nel modulo viene fornito un gruppo di opzioni con due caselle di controllo per selezionare le opzioni di ricerca e trova. La prima opzione è selezionata per impostazione predefinita e la ricerca viene eseguita sulla prima Colonna (ListItem ) per cercare il testo indicato.

Seleziona la seconda opzione per cercare il testo in ListSubItem colonne.

Nota: La risistemazione delle colonne non cambierà gli oggetti, ma solo la loro posizione di visualizzazione. Trascinando un ListSubItem colonna e portandola nella prima colonna non cambierà in un ListItem oggetto.

Se vuoi recuperare un valore sconosciuto da una particolare colonna, seleziona un nome di colonna dalla ComboBox fornita sotto la prima TextBox del Form per il testo di ricerca. Ad esempio, se non conosci la misurazione dell'altezza di uno studente e vorresti scoprirlo, seleziona il nome della colonna Altezza dalla ComboBox.

Dopo aver impostato i valori sopra indicati, fai clic su Trova elemento Pulsante di comando per passare all'operazione di ricerca. Se la ricerca ha esito positivo, il risultato verrà visualizzato nel grande controllo Etichetta sotto il pulsante di comando.

Fai clic sul pulsante di comando [Trova elemento].

Chiama SearchAndFind() Procedura.

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

All'inizio del programma, sia il Nome studente e Nome colonna ( 0facoltativo), vengono copiati dalle caselle di testo nelle variabili strFind e strColName rispettivamente dopo i controlli di convalida.

Nota: Il nome della colonna Proprietà non in elenco della casella combinata è impostato su Sì. È possibile selezionare un valore valido dall'elenco o digitarlo o lasciare vuota la casella combinata. Se digiti un valore diverso che non è nell'elenco, non verrà accettato.

In base all'Opzione di ricerca selezionata (1 - ListItem o 2 - ListSubItem) il metodo di scansione viene indirizzato all'Oggetto(i) specificato(i).

Utilizzando uno di questi metodi di ricerca si troverà l'Oggetto ListItem o riga che contiene il testo di ricerca. Il valore dell'indice di ListItem viene salvato nella variabile J per un uso successivo nel programma.

Nota: Il sistema crea automaticamente la numerazione automatica dell'indice nel momento in cui gli elementi di controllo ListView vengono popolati.

Il ListItem.Text il valore viene recuperato. Queste informazioni vengono unite al primo ColumnHeader. Testo (come Student:Robert King) e aggiunto nella stringa Msgtext da visualizzare nel controllo Etichetta nel modulo.

Se la colonna Nome intestazione è selezionata in ComboBox, allora GetColVal() La funzione viene chiamata con l'oggetto ListItem e il valore del testo dell'intestazione della colonna come parametri. Questa opzione è utile per recuperare informazioni sconosciute su uno Studente, come l'altezza dello studente, dal record.

Il codice VBA della funzione 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

La funzione sopra richiede due parametri. Il primo parametro è ListItem, dove si trova il nome dello Studente. Il secondo parametro è il nome della colonna. Età, altezza, peso, classe dello studente selezionato i valori sono memorizzati in ListItem.ListSubItems Oggetti. La funzione esamina lvwList.ColumnHeader valori per trovare il nome della colonna corrispondente, una volta trovato, il numero di indice della colonna viene utilizzato per recuperare il valore della colonna dall'oggetto ListSubItems e restituisce il valore al programma chiamante.

Il pulsante di comando [Trova per chiave] Fare clic su Procedura evento.

Abbiamo aggiunto un altro metodo per trovare il nome dello studente utilizzando il valore-chiave univoco di ListItem se utilizzato durante la creazione dell'elenco ListItem. Anche se è facoltativo, è meglio aggiungere un valore stringa chiave univoco (dovrebbe iniziare con un carattere alfabetico) piuttosto che ignorarlo.

Ad esempio, se dobbiamo trovare le informazioni di qualcuno in base al suo numero di identificazione come numero di previdenza sociale, numero di carta d'identità nazionale, numero di passaporto o numero di patente di guida e così via, una di queste informazioni può essere utilizzata come valore chiave per ListItem. Trovare un record con questo valore unico è molto semplice e veloce rispetto al metodo di ricerca per testo sopra descritto.

La procedura dell'evento 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

Come puoi vedere nella subroutine sopra, potremmo trovare direttamente il ListItem dove si trova il nome dello studente, con l'uso del valore-chiave, con una singola istruzione:Imposta lvItem =lvwList.ListItems.Item(xKeyVal).

La riga successiva legge il ListItem Text (o il nome dello Studente) nella variabile txt . Le due righe successive creano il testo del messaggio con il nome dello studente nella variabile stringa msgText.

Il prossimo Se . . .Allora istruzione controlla se un valore nome colonna è stato immesso nel controllo casella combinata. Se viene trovato, chiama GetColVal() Funziona con i parametri richiesti per trovare il valore della colonna e recuperarlo in varColVal Variabile e ritorna al programma chiamante. Il nome della colonna e il relativo valore recuperato vengono aggiunti alla variabile di stringa msgText da visualizzare sul controllo Etichetta nel modulo.

L'istruzione successiva evidenzia il record Riga dello studente come indicazione visiva che l'elemento cercato si trova nella riga. Il valore msgText viene visualizzato nella proprietà Caption dell'etichetta nel modulo.

Il codice VBA completo sul modulo modulo.

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

Scarica il Database Demo dal seguente Link:



  1. Esercitazione sul controllo di Microsoft TreeView
  2. Creazione del menu di accesso con il controllo TreeView
  3. Assegnazione di immagini ai nodi TreeView
  4. Assegnazione di immagini a TreeView Nodes-2
  5. Segnale di spunta di controllo TreeView Aggiungi Elimina
  6. Accesso a discesa TreeView ImageCombo
  7. Riorganizza i nodi TreeView trascinandoli
  8. Controllo ListView con TreeView di MS-Access
  9. Eventi di trascinamento della selezione di controllo ListView
  10. Controllo TreeView con moduli secondari