jjccx

jjccx's blog
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

RadTreeView有BUG?

Posted on 2008-03-24 17:35  jjccx  阅读(1286)  评论(0)    收藏  举报

在使用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" />&nbsp;
            <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" />&nbsp;
            <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>