Telerik Radtreeviewクライアント側をバインドします
-
22-10-2019 - |
質問
radtreeviewを入力するために使用したいオブジェクトのJavaScriptアレイがあります。オブジェクトのコレクションのために自分のバインディング方法を手動で書く以外に、クライアント側からこれを達成する方法を理解することはできません。
JavaScriptアレイの各オブジェクトにはあります
id darterID値テキスト
クライアント側のこのJavaScriptデータ構造からツリー全体を自動的に設定する方法はありませんか?これを1 x-1で行わなければなりませんか?私の配列を横断し、再帰的に木を下ることによって?
このデータを使用してJSONオブジェクトを取得するためにWebサービスを使用しています。拡張ノードだけでなく、ツリーを完全に構築したいと思います。
解決
どうやら、クライアント側から木全体をバインドする方法はありません。できることは、第1レベルのノードをバインドすることです。ユーザーがそれぞれをクリックすると、チャイルドノードを入力して別の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>
getRootNodesメソッドは次のようになります:
[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クライアント側の方法は次のようなものです。
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();
}
}
});
}
また、子ノードを埋めるためのWebサービス方法では、次のようなものになります。
[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;
}
注0 上記の方法は、radreenodedataの配列を返しません。それはあなた自身のカスタムオブジェクトの任意のコレクションにすることができます。同じことが言えます GetRootNodes
Telerikのウェブサイトからコピーしただけです;)
注1: 一度も同様のシナリオがあり、最初のレベルのノードを最初にロードし、クライアントクリックで他のノードをロードするこの手法を使用しました。ここに投稿したコードの一部は、元のコードのスリムなダウンバージョンです。
私はそれが役立つことを願っています。
他のヒント
ドキュメントによると、クライアント側 Nodes
プロパティは読み取り専用です: