[VB.Net] problemi con listview addhandler dinamico ItemChecked

venerdì 20 luglio 2012 - 17.28
Tag Elenco Tags  VB.NET  |  .NET 2.0

Fractals Profilo | Newbie

Ciao a tutti,
E' la prima volta che scrivo su questo forum e sono alle prime armi con vb.net e ho incontrato parecchie difficolta con addhandler delegate...
Nella mia routine ho integrato queste due righe di codice
Dim myDelegateCheck As New System.EventHandler(AddressOf MySubCheckedList) AddHandler ViewRowsProfile.ItemChecked, myDelegateCheck
La necessità di aggiungere l'evento tramite codice sorge dal fatto che se lo faccio tramite l'interfaccia grafica ad ogni popolamento della listview mi si innesca l'evento e percui avevo pensato di aggiungrlo e toglierlo ogni qual volta richiamo la mia sub per popolare la listview...
L'errore che mi si presenta è su "myDelegateCheck" e mi dice che non è possibile convertire l'oggetto system.eventhandler in system.windows.form.itemscheckedeventhandler ???????? che significa????

Soluzione Temporanea
Ho creato una variabile booleana globale all'interno della form che vado ad attivare a false quando inizia la routine di popolamento listview e a true quando finisce.
Riporto di seguito il codice della mia sub legata all'evento itemchecked
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Altro problema, all'interno dell'if della mia ViewRowsProfile_ItemChecked mi aspettavo di accedere tramite il mio sender direttamente all' item che ha scatenato l'evento ma forse non è cosi perche ho tutto l'oggetto listview ma non riesco in nessun modo a capire quale item ha scatenato l'evento.....

Be non penso che con questo thread sia una ottima introduzione a questa nuova comunity anche perche probabilmente sono stato un po confusionario ma vi prego di capire che non è semplice spiegare un problema quando ci sei da un giorno intero a sbatterci la testa non ricavando nulla...

Confido in una vostra mano e ringrazio anticipatamente tutte gli utenti che risponderanno
Ciao
Paolo

nico839 Profilo | Senior Member

ciao, per ricavarti l'item che ha causato l'evento itemcheck basta usare e.Index, cioè :
listview.items(e.Index) e hai l'elemento che ha scatenato l'evento.
Per assegnare via codice gli handler prova con
AddHandler listview.ItemCheck, AddressOf funzione e RemoveHandler listview.ItemCheck, AddressOf funzione

e funzione deve essere del tipo : Private Sub lvwPrincipal_ItemCheck(sender As System.Object, e As System.Windows.Forms.ItemCheckEventArgs)
se non ricordo male, ma controlla su google...

Ciao.
Nicolas

http://perledinico.blogspot.com

Fractals Profilo | Newbie

Ciao nico839,
i consigli che mi hai dato sono stati precisissimi e hai azzeccato in pieno il problema con la soluzione proprio che cercavo.

Giusto per completare la discussione facendo il debug del codice ho notato che l'evento veniva scatenato in pratica alla selezione dell'elemento e non al cambio di stato infatto ho dovuto sostituire l'evento con "ItemCheckedEventArgs"
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Una cosa che non ho capito è perche con l'evento che mi hai suggerito accedevo all'oggetto tramite "e.index" invece con questo "e.items.index" ???????????

Una curiosità e poi ti lascio stare visto che hai gia fatto tanto secondo te il principio di aggiungere e togliere handler per evitare l'innesco dell' evento ad ogni popolamento della listview è corretto oppure c'è una soluzione più idonea?

Grazie mille per il tuo aiuto

nico839 Profilo | Senior Member

Prego...
dunque è strano il comportamento poichè quello che ti ho suggerito si verifica quando un elemento sta cambiano stato, quindi sia che tu lo selezioni sia che tu lo deselezioni e il cambio avviene solo terminata la sub, mentre quello che hai utilizzato tu si verifica dopo il cambio di stato, quindi entrambi dovrebbero scatenarsi sia alla selezione che alla deselezione.
Per il "e.index" o "e.item.index" credo che derivi dall'oggetto che indica la "e": nel primo caso è un oggetto che ha come proprietà solamente l'indice, il valore passato e il valore che assumerà il check, mentre nel tuo caso rappresenta tutto il listviewitem che ha generato l'evento...credo ma non ne sono sicuro, bisognerebbe fare una ricerca approfondita sulla guida.
Per quanto riguarda l'aggiunta e la rimozione degli handler, per mia esperienza, credo che sia la cosa più veloce, se funziona, altrimenti la variabile di stato rimane una alternativa, però ripeto, è una mia idea dovuta alla mia esperienza, se ci sono altri modi migliori non li conosco e anzi, se qualcuno che li conosce ce li elenca penso ci farebbe un grandissimo favore....
Ciao.
Nicolas

http://perledinico.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5