Sei sulla pagina 1di 5

Mi collego come tecnico Torno indietro a Login I dati di accesso sono presenti Voglio collegarmi come Amm "Invalid

attempt to read when no data is present" Amm torna indietro poi Amm no problem Quando torna indietro le text box di accesso non vengono cancellate

La ListView un controllo complesso e di grande impatto visivo. lo stesso tipo di lista usato dall'explorer di windows per visualizzare files e cartelle. Le sue propriet permettono di personalizzarne la visualizzazione in cinque stili diversi : i pi importanti di questi sono Large Icone (Icone grandi), Small Icon (Icone pi ccole) e Details (Dettagli). Ci sono poi anche Tile e List, ma vengono usati men o spesso. Ecco alcuni esempi: ListView1.JPG Large Icon ListView2.JPG Small Icon ListView3.JPG Details

ListView Come al solito, ecco la compilation delle propriet pi interessanti: * CheckBoxes : indica se la listview debba visualizzare delle CheckBox vicin o ad ogni elemento * Columns : collezione delle colonne disponibili. Ogni colonna contraddistin ta da un testo (Text), un indice d'immagine (ImageIndex) e un indice di visualiz zazione (DisplayIndex) che specifica la sua posizione ordinale nella visualizzaz ione. Le colonne sono visibili sono con View = Details * FullRowSelect : indica se evidenziare tutta la riga o solo il primo elemen to, quando View = Details * GridLines : indica su visualizzare le righe della griglia, quando View = D etails * Groups : collezione dei gruppi disponibili * HeaderStyle : specifica se le intestazioni delle colonne possano essere cl iccate o meno * HideSelection : specifica se la listview debba nascondere la selezione qua ndo perde il Focus, ossia quando un altro controllo diventa il controllo attivo * HotTracking : abilita gli elementi ad apparire come collegamenti ipertestu ali quando il mouse ci passa sopra * HoverSelection : se impostata su True, sar possibile selezionare un element o semplicemente sostandoci sopra con il mouse * Items : collezione degli elementi della listview * LabelEdit : specifica se sia possibile modificare il testo dei SubItems da parte dell'utente, quando View = Details * LargeImageList : ImageList per View = Large Icon / Tile / List

* MultiSelect : indica se si possano selezionare pi elementi contemporaneamen te * o dal * * * menti * * OwnerDraw : indica se gli elementi debbano essere disegnati dal controllo codice del programmatore. Vedi articolo relativo ShowGroups : determina se visualizzare i gruppi ShowItemToolTips : determina se visualizzare i ToolTips dei rispettivi ele SmallIconList : ImageList per View = Small Icon / Details Sorting : il tipo di ordinamento, se alfabetico ascendente o discendente.

ListViewItem Ogni elemento della ListView contraddistinto da un oggetto ListViewItem, che, a differenza di quanto avveniva cone le normali liste come ListBox e ComboBox, n on costituisce una semplice stringa (o un tipo base facilmente rappresentabile) ma un nucleo a s stante, del quale si possono personalizzare tutte le caratterist iche visive e stilistiche. Poich la ListView compatibile con l'ImageList, tutti i membri della collezione Items sono in grado di impostare l'indice d'immagine as sociato, come si analizzato nella lezione scorsa. Inoltre, sempre manipolando le propriet, si pu attribuire ad ogni elemento un testo, un font, un colore diverso a seconda delle necessit. Nella visualizzazione a dettagli si possono impostare t utti i valori corrispettivi ad ogni colonna mediante la propriet SubItems, la qua le contiene una collezione di oggetti ListViewSubItem: di questi possibile modif icare il font e il colore, oltre che il testo. ListViewGroup Un gruppo un insieme di elementi raggruppati sotto la stessa etichetta. I gruppi vengono aggiunti alla lista utilizzando l'apposita propriet Groups e ogni elemen to pu essere assegnato ad un gruppo con la stessa propriet (ListViewItem.Group). O ggetti di questo tipo godono di poche caratteristiche: solo il testo ed il nome sono modificabili. Prima di procedere con ogni operazione, per, bisogna assicurar si che la propriet ShowGroups della ListView sia impostata a True, altrimenti... beh, niente festa. Ecco un esempio di codice: view source print? 01.'Nuovo gruppo 'Testo esplicativo' 02.Dim G As New ListViewGroup("Testo esplicativo") 03.'Nuovo elemento 'Elemento' 04.Dim L As New ListViewItem("Elemento") 05.'Aggiunge il gruppo alla listview 06.ListView1.Groups.Add(G) 07.'Setta il gruppo a cui L apparterr 08.L.Group = G 09.'Aggiunge l'elemento alla lista 10.ListView1.Items.Add(L) ListView con View = Details La ListView a dettagli la versione pi complessa di questo controllo, ed contraddi stinta dalla classica visualizzazione a colonne. Ogni colonna viene determinata in fase di sviluppo o a run-time agendo sulla collezione Columns nelle propriet d ella lista e bisogna ricordare l'ordine in cui le colonne vengono inserite poich questo influisce in maniera significativa sul comportamento dei SubItems. Infatt i il primo SubItem di un ListViewItem andr sotto la prima colonna, quella con ind ice 0, il secondo sotto la seconda e cos via. Un errore di ordine potrebbe produr

re quindi, risultati sgradevoli. Nell'esempio che segue, scriver un breve program ma per calcolare la spesa totale conoscendo i singoli prodotti e le singole quan tit di una lista della spesa. Ecco un'anteprima di come dovrebbe apparire la fine stra: ListView4.JPG I controlli usati sono deducibili dal nome e dall'utilizzo. Ecco quindi il codic e: view source print? 01.Class Form1 02. Private Sub cmdAdd_Click(ByVal sender As System.Object, _ 03. ByVal e As System.EventArgs) Handles cmdAdd.Click 04. 'Nuovo elemento 05. Dim Item As ListViewItem 06. 'Array dei valori che andranno a rappresentare i campi di 07. 'ogni singola colonna 08. Dim Values() As String = _ 09. {txtProduct.Text, nudPrice.Value, nudQuantity.Value} 10. 11. 'Inizializza Item sulla base dei valori dati 12. Item = New ListViewItem(Values) 13. 'E lo aggiunge alla lista 14. lstProducts.Items.Add(Item) 15. End Sub 16. 17. Private Sub cmdDelSelected_Click(ByVal sender As System.Object, _ 18. ByVal e As System.EventArgs) Handles cmdDelSelected.Click 19. 'Analizza tutti gli elementi selezionati 20. For Each SelItem As ListViewItem In lstProducts.SelectedItems 21. 'E li rimuove dalla lista 22. lstProducts.Items.Remove(SelItem) 23. Next 24. End Sub 25. 26. Private Sub cmdCalculate_Click(ByVal sender As System.Object, _ 27. ByVal e As System.EventArgs) Handles cmdCalculate.Click 28. 'Totale spesa 29. Dim Total As Single = 0 30. 'Prezzo unitario 31. Dim Price As Single 32. 'Quantit? 33. Dim Quantity As Int32 34. 35. For Each Item As ListViewItem In lstProducts.Items 36. 'Ottiene i valori da ogni elemento 37. Price = CSng(Item.SubItems(1).Text) 38. Quantity = CInt(Item.SubItems(2).Text) 39. Total += Price * Quantity 40. Next 41. 42. MessageBox.Show("Totale della spesa: " & Total & ".", _ 43. "Spesa", MessageBoxButtons.OK, MessageBoxIcon.Information) 44. End Sub 45.End Class Per i pi curiosi, mi addentrer ancora un p di pi nel particolare, nella fattispecie su una caratteristica molto apprezzata in una ListView a dettagli, ossia la poss ibilit di ordinare tutti gli elementi con un click. In questo caso, facendo click sull'intestazione (header) di una colonna, sarebbe possibile ordinare gli eleme

nti sulla base della qualit che quella colonna espone: per nome, per prezzo, per quantit. Dato che il metodo Sort non accetta alcun overload che consenta di usare un Comparer, bisogner implementare un algoritmo che compari tutti gli elementi e li ordini. In questo esempio si fa ricorso a due classi che implementano l'inte rfaccia generica IComparer(Of ListViewItem): il primo compara il nome del prodot to, mentre il secondo il prezzo e la quantit. Ecco il codice da aggiungere: view source print? 01.Class Form1 02. 'Queste classi saranno i comparer usati per ordinare 03. 'le righe della ListView, al pari di come si imparato nelle 04. 'lezioni sulle interfacce 05. Private Class ProductComparer 06. Implements IComparer(Of ListViewItem) 07. 08. Public Function Compare(ByVal x As ListViewItem, _ 09. ByVal y As ListViewItem) As Integer _ 10. Implements IComparer(Of ListViewItem).Compare 11. 'Gli oggetti da comparare sono ListViewItem, mentre la propriet 12. 'che bisogna confrontare il nome del prodotto, ossia 13. 'il primo sotto-elemento 14. Dim Name1 As String = x.SubItems(0).Text 15. Dim Name2 As String = y.SubItems(0).Text 16. Return Name1.CompareTo(Name2) 17. End Function 18. End Class 19. 20. Private Class NumberComparer 21. Implements IComparer(Of ListViewItem) 22. 23. Private Index As Int32 24. 25. 'Price True se ci si riferisce al Prezzo (elemento 1) 26. 'oppure False se ci si riferisce alla quantit (elemento 2) 27. Sub New(ByVal Price As Boolean) 28. If Price Then 29. Index = 1 30. Else 31. Index = 2 32. End If 33. End Sub 34. 35. Public Function Compare(ByVal x As ListViewItem, _ 36. ByVal y As ListViewItem) As Integer _ 37. Implements IComparer(Of ListViewItem).Compare 38. 'Qui bisogna ottenere il prezzo o la quantit: ci si basa 39. 'sul parametro passato al costruttore 40. Dim Val1 As Single = x.SubItems(Index).Text 41. Dim Val2 As Single = y.SubItems(Index).Text 42. Return Val1.CompareTo(Val2) 43. End Function 44. End Class 45. 46. 'Scambia due elementi in una lista: dato che ListViewItem sono 47. 'variabili reference, bisognerebbe clonarli per spostarne il valore, 48. 'come si faceva con i valori value, in questo modo: 49. 'Dim Temp As ListViewItem = L1.Clone() 50. 'L1 = L2.Clone() 51. 'L2 = Temp 52. 'Ma si userebbe troppa memoria. Perci la via pi facile

53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. n 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94.End

'usare i metodi della lista per scambiare gli elementi Private Sub SwapInList(ByVal List As ListView, ByVal Index As Int32) Dim Temp As ListViewItem = List.Items(Index + 1) List.Items.RemoveAt(Index + 1) List.Items.INSERT IGNORE(Index, Temp) End Sub 'Ordina gli elementi con l'algoritmo Bubble Sort gi 'descritto nell'ultima lezione teorica Private Sub SortListViewItems(ByVal List As ListView, _ ByVal Comparer As IComparer(Of ListViewItem)) Dim Occurrences As Int32 = 0 Do Occurrences = 0 For I As Int32 = 0 To List.Items.Count - 1 If I = List.Items.Count - 1 Then Continue For End If If Comparer.Compare(List.Items(I), List.Items(I + 1)) = 1 The SwapInList(List, I) Occurrences += 1 End If Next Loop Until Occurrences = 0 End Sub Private Sub lstProducts_ColumnClick(ByVal sender As System.Object, _ ByVal e As ColumnClickEventArgs) Handles lstProducts.ColumnClick Select Case e.Column Case 0 'Nome Me.SortListViewItems(lstProducts, New ProductComparer()) Case 1 'Prezzo Me.SortListViewItems(lstProducts, New NumberComparer(True)) Case 2 'Quantit Me.SortListViewItems(lstProducts, New NumberComparer(False)) End Select End Sub Class