Checkboxlist "indentate"

giovedì 30 aprile 2009 - 10.06

bolla111 Profilo | Senior Member

ciao a tutti...
dovrei creare un checkboxlist composta in questo modo:

checkpadre1
---checkfiglio1
---checkfiglio2
---checkfiglio3
checkpadre2
---checkfiglio1
---checkfiglio2
checkpadre3
...

in questo modo quando checkko un figlio automaticamente viene checckato anche il padre...come posso fare? grazie

luxsor Profilo | Guru

Ciao Fabio,
per quello che vuoi ottenere, ti consiglio di usare un TREEVIEW con la proprietà ShowCheckBox a True.

Ciao


------------------------
Luxsor

bolla111 Profilo | Senior Member

ma il treeview funziona solo col sitemap?

luxsor Profilo | Guru

Assolutamente no.
Hai la possibilità di creare i nodi dinamicamente.
Dai un occhiata qua:
http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.aspx

Ciao


------------------------
Luxsor

bolla111 Profilo | Senior Member

ciao...ho guardato il link che hai postato e ho provato ad usare questo codice:

Private Sub InitializeTreeView()
treeView1.BeginUpdate()
treeView1.Nodes.Add("Parent")
treeView1.Nodes(0).Nodes.Add("Child 1")
treeView1.Nodes(0).Nodes.Add("Child 2")
treeView1.Nodes(0).Nodes(1).Nodes.Add("Grandchild")
treeView1.Nodes(0).Nodes(1).Nodes(0).Nodes.Add("Great Grandchild")
treeView1.EndUpdate()
End Sub

ma non funziona...mi da errore sia sul beginupdate, sia sul nodes.add (nella parte tra parentesi, mi dice che è impossibile convertireil valore string in system.web.ui.webcontrols.treenode )

puoi darmi una mano? grazie...

bolla111 Profilo | Senior Member

allora...sono riuscito a popolarlo con quest'altro codice:

Dim node As TreeNode = New TreeNode
TreeView1.Nodes.Add(New TreeNode("Testo1", "Valore1"))
TreeView1.Nodes(0).ChildNodes.Add(New TreeNode("Testo2", "Valore2"))

io ho impostato su tutti i nodi le caselle di controllo (checkbox)
domanda: è possibile fare in modo che quando io checkki un elemento figlio venga checkkato automaticamente anche il padre?

bolla111 Profilo | Senior Member

ciao...qlcn può aiutarmi?

io ho impostato su tutti i nodi le caselle di controllo (checkbox)
domanda: è possibile fare in modo che quando io checkki un elemento figlio venga checkkato automaticamente anche il padre?

poi...se si clickka su un qualsiasi nodo, viene generto un postback, o qlcs del genere, non è possibile eliminare questa cosa?

grazie...

Jeremy Profilo | Guru

Ciao Fabio.
Usa la proprietà Parent del Nodo Figlio per ottenere il nodo padre e checkkarlo.

nodofiglio.Parent.Checked=true


Facci sapere...
Ciao

bolla111 Profilo | Senior Member

quindi devo farlo da codice?

e x la seconda domanda hai un idea?

Jeremy Profilo | Guru

>quindi devo farlo da codice?
Si ... devi farlo da codice.
Gestisci l'evento AfterCheck del treeview ed, eventualmente, fai un ciclo per verificare che tutti i sottonodi appartenenti al nodopadre siano checkkati prima di checkkare anche il padre.

>e x la seconda domanda hai un idea?
No ... mi dispiace ... aspetta qualcuno più pratico di ASP che ti risponda.

Ciao

bolla111 Profilo | Senior Member

ok grazie...

bolla111 Profilo | Senior Member

problema...non mi viene riconosciuto alcun evento treeview.aftercheck o metodo onaftercheck...perchèèèèè?

Jeremy Profilo | Guru

Ciao Fabio.
Perchè in ASP gli eventi son diversi da quelli che ci sono in WindowsForms.
Prova con l'evento TreeNodeCheckChanged

Facci sapere...
Ciao

bolla111 Profilo | Senior Member

ciao..ho giò provato ad usare quell'evento...solo che non viene generato ogni volta che checkko un checkbox...
questa è la funzione che richiamo con quell'evento:

Protected Sub TreeViewMN_TreeNodeCheckChanged(ByVal sender As Object, ByVal e As TreeNodeEventArgs) Handles TreeViewMN.TreeNodeCheckChanged

.
.
.

End Sub

msdn dice che "Si verifica quando lo stato di una casella di controllo nel controllo TreeView viene modificato tra gli invii al server"... cioè viene generato solo su un post back o quando cambio pagina...
potrei anche forzare il postback x poi richiamare quell'evento...però non è bellissima come cosa...

bolla111 Profilo | Senior Member

niente...il problema che ti dicevo prima l'ho lasciato perdere...ora ho fatto in modo che l'evento richiami la funzione che mi serve...
il problema è che non so come usare la proprietà parent...
in pratica devo fare in modo di checkkare l'elemento padre del check che ho selezionato...ma come faccio a recuperarlo questo...
oppure c'è un altro modo?

Jeremy Profilo | Guru

Ciao Fabio.
Adesso sono un pò di fretta .... prova a vedere se così risolvi:
TreeView1.SelectedNode.Parent.Checked = True

bolla111 Profilo | Senior Member

non funziona...mi dice che non è impostato su un'istanza di oggetto...
cmq...

questo è quello che ho provato a fare io...

Protected Sub TreeView1_TreeNodeCheckChanged(ByVal sender As Object, ByVal e As TreeNodeEventArgs) Handles TreeView1.TreeNodeCheckChanged

If TreeView1.CheckedNodes.Count > 0 Then

Dim node As TreeNode

For Each node In TreeView1.CheckedNodes

If Not node.ChildNodes.Count > 0 Then

If node.Parent.Checked = False Then
node.Parent.Checked = True
End If

End If
Next node

End If

End Sub

sembra che funzioni...ma alla fine mi da questo errore:
"Insieme modificato. L'operazione di enumerazione non può essere eseguita."
non so cos'è...

Jeremy Profilo | Guru

Ciao Fabio.
E' normale l'errore che ricevi
Succede perchè, checkkando il nodo mentre iteri la collection CheckedNodes, la collection stessa viene modificata.
Quindi, o fai una copia della collection prima di iterarla, o ci concentriamo su l'errore che ottieni riguardo alla mancata creazione dell'istanza di Parent.
Anche questo è normale, se consideriamo che il nodo padre, non ha nessun parent, ed è, probabilmente, in quel caso che ti solleva l'eccezione.
prova con questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e poi ... facci sapere...
Ciao

bolla111 Profilo | Senior Member

ma il codiche che mi hai postato devo usarlo da solo dentro la funzione evento? perchè non funziona, mi da errore ("Riferimento a un oggetto non impostato su un'istanza di oggetto.")
cmq io dall'ultimo codice che ti ho postato ho fatto una modifica...te lo posto:

Protected Sub TreeView1_TreeNodeCheckChanged(ByVal sender As Object, ByVal e As TreeNodeEventArgs) Handles TreeView1.TreeNodeCheckChanged

If TreeView1.CheckedNodes.Count > 0 Then

Dim node As TreeNode

For Each node In TreeView1.CheckedNodes

If Not node.ChildNodes.Count > 0 Then

Try
If node.Parent.Checked = False Then
node.Parent.Checked = True
End If
Catch
End Try

End If
Next node

End If

End Sub

la differenza sta nel try che ho aggiunto...
così ora ho visto che il solito errore ("Insieme modificato. L'operazione di enumerazione non può essere eseguita.") mi viene dato solo se viene eseguita l'istruzione: node.Parent.Checked = True.
ho letto cio che mi hai scritto come risposta ma non ci ho capito molto...puoi aiutarmi?

Jeremy Profilo | Guru

Ciao Fabio.
Sostituisci tutto il codice che hai postato con questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Facci sapere...
Ciao

bolla111 Profilo | Senior Member

grazie...così funziona...eè molto più semplice del codice che avevo fatto io...
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5