Domanda

Ho un array JavaScript di oggetti che vorrei utilizzare per popolare un RadTreeView. Io non riesco a capire come eseguire questa operazione dal lato client diverso che scrivere manualmente il mio metodo di rilegatura per la mia collezione di oggetti.

Ogni oggetto nel mio array JavaScript ha

Id ParentId Valore Testo

Non c'è un modo per inserire automaticamente un intero albero da questa struttura dati JavaScript sul lato client? Devo fare questo 1-by-1? Percorrendo il mio array e ricorsivamente scendendo l'albero?

sto utilizzando un servizio web per ottenere un oggetto JSON con questi dati e vorrei costruire l'albero completamente, non solo sul nodo espanso.

È stato utile?

Soluzione

A quanto pare, non c'è modo per legare un intero albero dal lato client. Il massimo che può fare è nodi bind di primo livello e, come l'utente fa clic su ciascuno di essi, è possibile popolare i nodi figlio fare un'altra chiamata al metodo web.

<telerik:RadTreeView OnClientNodeClicking="PopulateChild" DataTextField="Text" 
                            ID="datesTree" runat="server">
                            <WebServiceSettings Path="../AcmeWebService.asmx" Method="GetRootNodes" />
  <Nodes>
    <telerik:RadTreeNode Text="Root Node" ImageUrl="../images/truckicon.png"  ExpandMode="WebService" />
  </Nodes>
</telerik:RadTreeView>

Il tuo metodo GetRootNodes può apparire così:

[WebMethod, ScriptMethod]
public RadTreeNodeData[] GetRootNodes(RadTreeNodeData node, object context)
{
    DataTable productCategories = GetProductCategories(node.Value);
    List<RadTreeNodeData> result = new List<RadTreeNodeData>();
    foreach (DataRow row in productCategories.Rows)
    {
        RadTreeNodeData itemData = new RadTreeNodeData(); 
        itemData.Text = row["Title"].ToString(); 
        itemData.Value = row["CategoryId"].ToString();
        if (Convert.ToInt32(row["ChildrenCount"]) > 0) 
        { 
            itemData.ExpandMode = TreeNodeExpandMode.WebService; 
        }
        result.Add(itemData);
    }
    return result.ToArray();
}

PopulateChild metodo sul lato client può essere qualcosa del tipo:

function PopulateChild(sender, args) {
var treeView = $find('datesTree');

    var nodeText = "";

    $.ajax({
        type: "POST",
        url: "../AcmeWebService.asmx/GetChildNodes",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "{'nodeText': '" + nodeText + "','nodeValue': '" + args.get_node().get_value() + "','param2':'" + treeView.get_allNodes()[0].get_value() + "' }",
        success: function(msg) {
            if (treeView != null) {
                treeView.trackChanges();
                var parent = treeView.get_selectedNode() || treeView;
                var count = parent.get_nodes().get_count();
                for (var i = 0; i < msg.d.length; i++) {
                    var node = new Telerik.Web.UI.RadTreeNode();                                                
                    node.set_text(msg.d[i].Text);
                    node.set_value(msg.d[i].ParentID);
                    node.set_expanded(true);
                    parent.get_nodes().add(node);
                }
                treeView.commitChanges();
            }
        }
    });

}

E sul metodo di servizio Web per popolare i nodi figlio può essere qualcosa del tipo:

[WebMethod, ScriptMethod]
public IEnumerable<YourNode> GetChildNodes(string nodeText, string nodeValue, int param2)
{
   //call your DAL with any parameter you passed in from above
   IEnumerable<YourNode> nodes = ...
   return nodes;
}

Nota 0 Il metodo sopra non restituisce un array di RadTreeNodeData. Può essere qualsiasi insieme di oggetti personalizzati. Stesso discorso per la GetRootNodes è solo che ho copiato che uno dal sito web di Telerik;)

Nota 1: ho avuto uno scenario simile, una volta e ho usato questa tecnica di nodi di carico di primo livello inizialmente e caricare gli altri sul client click. Parte del codice che ho postato qui è una versione snellita del mio codice originale.

Spero che aiuta.

Altri suggerimenti

Secondo la documentazione di proprietà Nodes lato client è di sola lettura:

Il RadTreeView client oggetto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top