在使用RadTreeView(RadControls for ASP.NET Q2 2007)时,我们需要完成延迟加载的功能,设置ExpandMode为ServerSideCallBack,在后台NodeExpand事件中加入加载子节点的代码。延迟加载效果实现成功。但是当我们按下某个按钮,回发到服务器端后,出现了一个问题,在后台代码中取不到动态加载的节点。这难道是RadTreeView的BUG?
解决方法有两个:
1、在Session中Cache一棵Rad树下来,然后对这棵Cache的树进行操作。
2、有些环境下不允许使用Session,我们只能在客户端使用脚本遍历Rad树,生成XML,并把它放入一个hidden input之类的容器中,然后我们再在后台取得hidden input中的XML,调用RadTreeView的LoadXmlString方法重新加载树控件。
第二种方法附代码如下:
<%@ Page Language="C#" ValidateRequest="false" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="Telerik.WebControls" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Register Assembly="RadTreeView.Net2" Namespace="Telerik.WebControls" TagPrefix="radT" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
this.Button2.Attributes.Add("onclick", "return SaveTreeViewState();");
if (this.IsPostBack)
{
return;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
LoadTree(RadTreeView1);
}
protected void Button2_Click(object sender, EventArgs e)
{
RadTreeView tempTreeView = new RadTreeView();
string treeViewXml = RadTreeView1.GetXml();
tempTreeView.LoadXmlString(treeViewXml);
ArrayList nodes = tempTreeView.GetAllNodes();
RadTreeView1.Nodes.Clear();
RadTreeView1.LoadXmlString(TextBox1.Text);
foreach (RadTreeNode node in nodes)
{
RadTreeNode newNode = RadTreeView1.FindNodeByValue(node.Value);
if (newNode.Nodes.Count <= 0)
{
newNode.ExpandMode = node.ExpandMode;
}
}
this.Response.Write("<B>Checked Nodes:</B><BR>\n");
foreach (RadTreeNode node in this.RadTreeView1.CheckedNodes)
{
this.Response.Write(node.Text + "<BR>\n");
}
this.Response.Write("<hr>\n");
}
protected void LoadTree(RadTreeView tree)
{
RadTreeView1.Nodes.Clear();
RadTreeNode node = new RadTreeNode();
node.Text = "Search Engine";
node.Value = "SearchEngine";
node.Category = "SearchEngine";
node.ExpandMode = ExpandMode.ServerSideCallBack;
node.Checkable = true;
RadTreeView1.Nodes.Add(node);
}
private void AddChildNodes(RadTreeNode node)
{
RadTreeNode n = node.Nodes.FindNodeByValue("google");
RadTreeNode n1 = node.Nodes.FindNodeByValue("google1");
if (node.Nodes.FindNodeByValue("google") == null)
{
RadTreeNode childNode = new RadTreeNode();
childNode.Text = "google";
childNode.Value = "google";
childNode.Category = "SearchEngine";
childNode.ExpandMode = ExpandMode.ClientSide;
node.Nodes.Add(childNode);
}
}
protected void RadTreeView1_NodeExpand(object o, RadTreeNodeEventArgs e)
{
AddChildNodes(e.NodeClicked);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>无标题页</title>
</head>
<body>
<script language="javascript" type="text/javascript">
var treeViewXml;
function SaveTreeViewState()
{
var textbox = document.getElementById('<%= TextBox1.ClientID %>');
var tree = <%= RadTreeView1.ClientID %>;
treeViewXml = "<Tree>";
var rootNodes = tree.Nodes;
var i;
var len = rootNodes.length;
for(i=0; i<len; i++)
{
treeViewXml +=
'<Node Text="' + rootNodes[i].Text +
'" Value="' + rootNodes[i].Value +
'" Category="' + rootNodes[i].Category +
'" Expanded="' + GetBoolean(rootNodes[i].Expanded) +
'" Checked="' + GetBoolean(rootNodes[i].Checked) +
'">';
GetTreeViewXml(rootNodes[i].Nodes);
treeViewXml += '</Node>';
}
treeViewXml += "</Tree>";
textbox.value=treeViewXml;
return true;
}
function GetBoolean(obj)
{
if(obj=='0') return 'false';
if(obj=='1') return 'true';
return obj;
}
function GetTreeViewXml(nodes)
{
if(nodes == null || nodes == undefined)
{
return;
}
var i;
var len = nodes.length;
for(i=0; i<len; i++)
{
treeViewXml +=
'<Node Text="' + nodes[i].Text +
'" Value="' + nodes[i].Value +
'" Category="' + nodes[i].Category +
'" Expanded="' + GetBoolean(nodes[i].Expanded) +
'" Checked="' + GetBoolean(nodes[i].Checked) +
'">';
GetTreeViewXml(nodes[i].Nodes);
treeViewXml += '</Node>';
}
}
</script>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" />
<radT:RadTreeView ID="RadTreeView1" runat="server" CheckBoxes="True" OnNodeExpand="RadTreeView1_NodeExpand">
</radT:RadTreeView>
<input id="Hidden1" type="hidden" runat="server" />
<asp:TextBox ID="TextBox1" runat="server" Height="336px" TextMode="MultiLine" Width="322px"></asp:TextBox>
</div>
</form>
</body>
</html>
浙公网安备 33010602011771号