我有一个 javascript 对象数组,我想用它来填充 RadTreeView。除了为我的对象集合手动编写自己的绑定方法外,我不知道如何从客户端完成此操作。
我的 javascript 数组中的每个对象都有
Id ParentId 值文本
有没有办法从客户端的这个 javascript 数据结构中自动填充整个树?我必须一一进行吗?通过遍历我的数组并递归地沿着树向下走?
我正在使用 Web 服务来获取包含此数据的 JSON 对象,并且我想完全构建树,而不仅仅是在扩展节点上。
我有一个 javascript 对象数组,我想用它来填充 RadTreeView。除了为我的对象集合手动编写自己的绑定方法外,我不知道如何从客户端完成此操作。
我的 javascript 数组中的每个对象都有
Id ParentId 值文本
有没有办法从客户端的这个 javascript 数据结构中自动填充整个树?我必须一一进行吗?通过遍历我的数组并递归地沿着树向下走?
我正在使用 Web 服务来获取包含此数据的 JSON 对象,并且我想完全构建树,而不仅仅是在扩展节点上。
显然,没有办法从客户端绑定整个树。您最多可以绑定一级节点,当用户单击每个节点时,您可以填充子节点以进行另一个 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上述方法不返回 RadTreeNodeData 数组。它可以是您自己的自定义对象的任何集合。也一样,GetRootNodes
只是我从 Telerik 的网站上复制了那个;)
注意 1:我曾经遇到过类似的情况,我使用了这种技术,最初加载第一级节点并在客户端单击时加载其他节点。我在这里发布的一些代码是我原始代码的精简版。
我希望它有所帮助。
根据文档,客户端Nodes
属性是只读的: