33 messaggi dal 17 febbraio 2015
Ciao

sto usando Razor ed ho questo helper:

@helper  BuildTreeView(IEnumerable<dynamic> data, int? parentid = null, int level = 0) {
    var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
    int separatore = 0;
    var aCapo = "";
    if (nodes.Any()) {
        if(nodes.First().ParentId != null){
            level++;
            separatore = 1;
            if (level == 1) {aCapo = "<br>";}            
        }
        
        foreach (var node in nodes) {
           
              @Html.Raw(aCapo)  @node.Text <text>>></text> 
           
            @BuildTreeView(data, node.Id, level);
        }
    }
}


Questo prende dal database delle categorie e sottocategorie e le mostra così:

Node1 >> Node1.1 >> Node1.2 >> ...
Node2 >> Node2.1 >> ...

Ora, io vorrei che quando si arriva all'ultimo "sottonodo" non apparisse più ">>".

Come posso fare?

Grazie in anticipo!
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
penso che sia più facile stampare il >> prima del nodo.
Togli del tutto la parte <text>>></text> e riutilizza invece la variabile aCapo valorizzandola con "&gt;&gt;" quando il livello è maggiore o uguale a 2.

Prova così:
@helper  BuildTreeView(IEnumerable<dynamic> data, int? parentid = null, int level = 0) {
    var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
    int separatore = 0;
    var aCapo = "";
    if (nodes.Any()) {
        if(nodes.First().ParentId != null){
            level++;
            separatore = 1;
            if (level == 1) {aCapo = "<br>";}
            else if (level >= 2) {aCapo = "&gt;&gt;";}

        }
        foreach (var node in nodes) {
              @Html.Raw(aCapo)  @node.Text           
            @BuildTreeView(data, node.Id, level);
        }
    }
}


ciao,
Moreno
Modificato da BrightSoul il 18 febbraio 2015 00.02 -

Enjoy learning and just keep making
33 messaggi dal 17 febbraio 2015
Ciao BrightSoul!

grazie per il tuo aiuto, funziona correttamente.

Ho un altra domanda, sempre legato a questo codice: come posso evitare di avere una "root" come categoria principale.

Cioè, vorrei che le categorie non facessero capo a "root" ma fossero indipendenti con le loro eventuali sottocategorie.

Grazie di nuovo!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
dovresti cominciare a costruire l'albero dagli elementi contenuti in root, anziché da root stesso.

Ipotizzo che la tua prima invocazione all'helper BuildTreeView sia fatta più o meno così:
@Html.BuildTreeView(elementi, null, 0)


Anziché passare null come secondo parametro, dovresti passare l'id dell'elemento di root. In questo modo, il BuildTreeView inizierà con lo stampare gli elementi che discendono dall'elemento che porta quell'id.
@Html.BuildTreeView(elementi, idDelNodoDiRoot, 0)


ciao,
Moreno

Enjoy learning and just keep making
33 messaggi dal 17 febbraio 2015
Ciao Moreno,

grazie al tuo consiglio funziona alla grande!!!

Ora sto provando ad adattare questo codice in modo che mi crei delle dropdownlist così:

<select>
<option value="SottoCat1.b">
Cat1 >> SottoCat1.a >> SottoCat1.b
</option>
<option value="Cat2">
Cat2
</option>
<option value="SottoCat3.a">
Cat3 >> SottoCat3.a
</option>
....
</select>

==== Codice ====
@{
var db = Database.Open("TreeView");
var treeView = db.Query("SELECT * FROM Nodes");
}

@BuildTreeView(treeView)




@helper BuildTreeView(IEnumerable<dynamic> data, int? parentid = 1, int level = 0) {
var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
var aCapo = "";

if (nodes.Any()) {
if(nodes.First().ParentId != null){
level++;
if (level == 1) {aCapo = "<br>";
}
else if (level >= 2) {aCapo = "&gt;&gt;";}

}

foreach (var node in nodes) {

@Html.Raw(aCapo) @node.Text
@BuildTreeView(data, node.Id, level);
}

}
}
================


Non è mia intenzione approfittarmi, ma sapresti come implementare?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
vuoi creare una <select> che contenga tutte le categorie esistenti o solo le foglie?

Se volessi stampare solo le foglie (come mi sembra di capire dai tuoi esempi), potresti prendere spunto da questo:
https://dotnetfiddle.net/iHU6eA

Ho modificato leggermente l'algoritmo aggiungendo un parametro accumulatore in cui mantengo tutto il percorso corrente, affinché sia stampato per intero per ogni categoria, non importa quanto annidata.

Per poterlo dimostrare ho modificato @Html.Raw in Console.Write, ma tu ovviamente risostituiscile in modo che torni a funzionare come helper. Inoltre mi sono appoggiato ad una classe "Nodo" anziché usare il dynamic. Dovrai risostituire anche quello.

ciao,
Moreno
Modificato da BrightSoul il 22 marzo 2015 08.35 -

Enjoy learning and just keep making
33 messaggi dal 17 febbraio 2015
BrightSoul ha scritto:
Ciao,
vuoi creare una <select> che contenga tutte le categorie esistenti o solo le foglie?


Vorrei stampare una select del genere (ed i "values" dell'ultima Cat o SubCat):

Cat1

Cat2

Cat2 >> SubCat2.a

Cat2 >> SubCat2.a >> SubCat2.b

....



Per poterlo dimostrare ho modificato @Html.Raw in Console.Write, ma tu ovviamente risostituiscile in modo che torni a funzionare come helper. Inoltre mi sono appoggiato ad una classe "Nodo" anziché usare il dynamic. Dovrai risostituire anche quello.


Ho provato e riprovato a ricostruire l'Help e ad adattarlo a Razor, ma non sono mica riuscito.

E' un peccato perché c'eravamo vicini :-)

Grazie lo stesso Moreno!
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

AspNetx ha scritto:

Cat1
Cat2
Cat2 >> SubCat2.a
Cat2 >> SubCat2.a >> SubCat2.b

Ok, dunque vuoi stampare l'elenco completo delle categorie, non solo le foglie.

Ho aggiornato lo script in questo modo:
https://dotnetfiddle.net/uX9vZW

Ri-trasformato in un helper dovrebbe essere più o meno così:
@helper  BuildTreeView(IEnumerable<dynamic> data, int? parentid = 1, int level = 0, string accumulatore = "")
    {
    var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
    var separatore = "";
    if (nodes.Any())
    {
    if (nodes.First().ParentId != null)
    {
    if (level > 0)
    {
    separatore = " >> ";
    }
    }

    if (level == 0){
    @Html.Raw("<select>");
        }
        foreach (var node in nodes)
        {
        var fullText = accumulatore + separatore + node.Text;
        @Html.Raw(string.Format("\r\n<option value=\"{0}\">{1}</option>", node.Text, fullText));
        @BuildTreeView(data, node.Id, level + 1, fullText);
        }
        if (level == 0){
        @Html.Raw("\r\n</select>");
    }
    }
    }


AspNetx ha scritto:

E' un peccato perché c'eravamo vicini :-)

Non ti arrendere così facilmente, non puoi lasciare che un pezzo di codice l'abbia vinta!

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.