ciao Davide,
separiamo le questioni: da una parte hai una classe che agisce da sorgente dati, mentre dall'altra hai dei controlli web che visualizzano quei dati.
Non sono strettamente vincolati l'uno all'altro ma, per poter lavorare insieme, hanno bisogno di un'interfaccia, cioè un contratto che la classe sorgente presenta e che il controllo web accetta di rispettare.
Lavorando con i dati gerarchici esistono due tipi di contratto: l'IHierarchicalEnumerable e l'IHierarchicalDataSource. Gli sviluppatori dei controlli web possono scegliere se adeguarsi ad uno solo o a entrambi.
- IHierarchicalEnumerable è un contratto molto semplice che, proprio come IEnumerable, promette di snocciolare gli elementi uno dopo l'altro, fornendo anche lo strumento per navigare l'albero in profondità.
Se tu dovessi sviluppare un controllo web, queste condizioni ti soddisferebbero? Io direi che... dipende, magari sto scrivendo un controllo che si limita a presentare l'albero quindi sì, le premesse sono sufficienti a farmi svolgere il lavoro. - IHierarchicalDataSource è un contratto che offre condizioni diverse, infatti propone un accesso casuale ai nodi, più o meno come un IList. Vuol dire che fornendo un percorso del tipo /root/foglia, la sorgente dati mi permette di arrivare esattamente a quel nodo che avevo chiesto, senza doverli passare in rassegna uno alla volta.
Se sto sviluppando un controllo web per riorganizzare i nodi dell'albero od eseguire comandi su di essi, allora questo contratto è più idoneo perché mi lascia agire in maniera puntuale.
Quando uno sviluppatore sceglie di attenersi all'uno o all'altro contratto (o ad entrambi), non gli è precluso di realizzare un
templated control ma può fare le due scelte in maniera indipendente.
doppiomango ha scritto:
con IHierarchicalEnumerable non ho modo di utilizzarlo con dei controlli che gestiscano i button. Al contrario IHierarchicalDataSource controlli come il TreeView, che a sua volta permette invece l'utilizzo di button.
No, non c'è alcun nesso di causalità tra l'interfaccia e il supporto ai Button da parte del controllo.
Il controllo TreeView di ASP.NET non è un
templated controls e quindi non puoi personalizzare il rendering del nodo inserendoci dentro dei Button. E' stata una libera scelta degli sviluppatori; non dobbiamo neanche andare ad indagare con quale/i delle due interfacce questi due controlli lavorino.
Invece, capita che Thomas Gerber, sviluppatore dell'
OdcTreeView, abbia scelto di creare un
templated control che, date le funzionalità che ha voluto implementare, può lavorare solo con una sorgente dati di tipo IHierarchicalDataSource.
doppiomango ha scritto:
Questo significa che sono legato a dei controlli con un markup non pienamente customizzabile...
No, grazie all'OdcTreeView hai già ampia libertà di movimento ma devi tenere presente che un minimo di markup di intelaiatura lui lo genera, come ad esempio la lista <ul> e gli elementi <li> annidati che gli servono a creare visivamente l'albero.
Dato che disponi del sorgente, potresti rendere personalizzabile anche questo aspetto.
doppiomango ha scritto:
In breve non posso usare lo stesso controllo creato nell'altra discussione.
Esatto. Nell'altra discussione usavamo il TreeView di ASP.NET perché volevamo semplicemente mostrare l'albero a video. Ora ti va stretto e dunque puoi provare l'OdcTreeView che si trova su CodeProject. Dato che richiede un IHierarchicalDataSource, bisogna implementarlo anche nella sorgente dati. Vedi il codice del
progetto di esempio.
ciao
Modificato da BrightSoul il 22 luglio 2013 21.42 -