扩展.net标准TreeView控件,代码如下 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace AjaxTreeViewNS
{
    
    [ToolboxData("<{0}:AjaxTreeView runat=server></{0}:AjaxTreeView>")]
    public class AjaxTreeView : TreeView
    {
        string L_SpecialID = "WDF_V1_0_0_0_MagicControl_AjaxTreeView_";
        
       
        /// <summary>
        /// 属性:目标控件ID
        /// </summary>
       
        [Category("Wonderful属性")]
        [Description("目标控件ID")]
        [DefaultValue("")]
        [Localizable(true)]
        [TypeConverter(typeof(ControlIDConverter))]
        public string ReflectControlID
        {
            get
            {
                if (!(ViewState[L_SpecialID + "ReflectControlID"] == null))
                {
                    string L_ReflectControlID = ViewState[L_SpecialID + "ReflectControlID"].ToString();
                    return L_ReflectControlID;
                }
                else
                {
                    return "";
                }
            }
            set
            {
                ViewState[L_SpecialID + "ReflectControlID"] = value;
            }
        }        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            Type L_Type = typeof(AjaxTreeView);
            //输出ajax引擎所需变量
            StringBuilder L_JsStr = new StringBuilder();
            L_JsStr.Append("<script  type=\"text/javascript\">");
            L_JsStr.Append("var L_RequestURL = '" + HttpContext.Current.Request.Url + "';");
            L_JsStr.Append("</script>");
            if (!(Page.ClientScript.IsClientScriptBlockRegistered(L_SpecialID + "InitJs")))
            {
                Page.ClientScript.RegisterClientScriptBlock(L_Type, L_SpecialID + "InitJs", L_JsStr.ToString());
            }            
            //注册Ajax模块
            Page.ClientScript.RegisterClientScriptResource(L_Type, "AjaxTreeViewNS.JS.BaseJS.Wonderful_AjaxEngine.js");
            //注册本控件Ajax发起和处理函数
            Page.ClientScript.RegisterClientScriptResource(L_Type, "AjaxTreeViewNS.JS.SpecialJS.Wonderful_AjaxSpecialModeal_AjaxTreeView.js");            
        }        /// <summary>
        /// TreeView的Render结构设计很精巧,一个节点是一个Table,连接线用Img图像,节点缩进层次通过在Img前面加入特定宽度的Div实现,隐藏节点只需要隐藏该节点对应的Table就可以
        /// </summary>
        /// <param name="output"></param>
        protected override void RenderContents(HtmlTextWriter output)
        {
            //对每一个节点输出其对应的Table
            output.AddAttribute(HtmlTextWriterAttribute.Id, "Div_" + this.ClientID);
            output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0px");
            output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0px");
            output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, this.BackColor.ToString());
            output.AddAttribute(HtmlTextWriterAttribute.Bordercolor, this.BorderColor.ToString());
            output.RenderBeginTag(HtmlTextWriterTag.Div);
            
            //输出节点
            RenderNodes(this.Nodes, output, "");            output.RenderEndTag();
        }        /// <summary>
        /// 递归Render节点
        /// </summary>
        /// <param name="Nodes"></param>
        protected void RenderNodes(TreeNodeCollection Nodes, HtmlTextWriter output, string SubIndex)
        {
            for (int i = 0; i < Nodes.Count; i++)
            {
                TreeNode L_Node = Nodes[i];
                int L_Depth = L_Node.Depth;//深度
                
                //输出
                output.AddStyleAttribute(HtmlTextWriterStyle.Display, "block");
                output.AddAttribute(HtmlTextWriterAttribute.Id, SubIndex + "_" + i.ToString() + "_" + this.ClientID + "_" + L_SpecialID + "_Table");
                output.RenderBeginTag(HtmlTextWriterTag.Table);                output.RenderBeginTag(HtmlTextWriterTag.Tr);
                output.RenderBeginTag(HtmlTextWriterTag.Td);
                output.RenderEndTag();//End OF Td
                output.RenderEndTag();//End OF Tr                output.RenderBeginTag(HtmlTextWriterTag.Tr);                output.RenderBeginTag(HtmlTextWriterTag.Td);
                output.AddAttribute(HtmlTextWriterAttribute.Style, "width:" + (L_Depth * 10).ToString() + "px");
                output.RenderBeginTag(HtmlTextWriterTag.Div);
                output.RenderEndTag();
                output.RenderEndTag();//End OF Td                output.AddAttribute("onmouseover", L_SpecialID + "MouseToHand()");//悬浮鼠标变手型
                output.AddAttribute("onmouseout", L_SpecialID + "MouseReturn()");//离开鼠标还原
                output.RenderBeginTag(HtmlTextWriterTag.Td);
                output.AddAttribute(HtmlTextWriterAttribute.Onclick, L_SpecialID + "TreeTransform('" + SubIndex + "'," + i + ",'" + this.ClientID + "')");//点击触发js函数,实现菜单缩放
                output.AddAttribute(HtmlTextWriterAttribute.Alt, "");
                output.AddAttribute(HtmlTextWriterAttribute.Src, Page.ClientScript.GetWebResourceUrl(typeof(AjaxTreeView), "AjaxTreeViewNS.Images." + "NodeCur_" + (L_Depth % 4).ToString() + ".gif"));
                output.RenderBeginTag(HtmlTextWriterTag.Img);
                output.RenderEndTag();//End OF Img
                output.RenderEndTag();//End OF Td                output.AddAttribute("onmouseover", L_SpecialID + "MouseToHand()");//悬浮鼠标变手型
                output.AddAttribute("onmouseout", L_SpecialID + "MouseReturn()");//离开鼠标还原
                output.RenderBeginTag(HtmlTextWriterTag.Td);
                output.AddAttribute(HtmlTextWriterAttribute.Onclick, "WDF_V1000_MagicControl_AjaxTreeView_TreeNodeOnClick('" + this.ClientID + "','" + L_Node.Value + "','" + this.ReflectControlID + "')");//点击启用ajax回调
                //output.AddAttribute("onmouseover", "");//悬浮鼠标变手型并计时,超过2秒则启用ajax回调获取数据同时关闭callback锁
                //output.AddAttribute("onmouseout", "");//离开鼠标还原,计时停止
                output.RenderBeginTag(HtmlTextWriterTag.Span);
                output.Write(L_Node.Text);
                output.RenderEndTag();//End OF Span
                output.RenderEndTag();//End OF Td                output.RenderEndTag();//End OF Tr                output.RenderBeginTag(HtmlTextWriterTag.Tr);
                output.RenderBeginTag(HtmlTextWriterTag.Td);
                output.RenderEndTag();//End OF Td
                output.RenderEndTag();//End OF Tr                output.RenderEndTag();//End OF Table                TreeNodeCollection L_ChildNodes = L_Node.ChildNodes;
                RenderNodes(L_ChildNodes, output, SubIndex + "_" + i.ToString());
            }
        }
    }
}
现在的问题是: 在设计状态下设置“ReflectControlID”即报错 
分析控件时出错,未能对属性“ReflectControlID”设置“Panel1”(Panel1就是设置的值) 第一次遇到这样奇怪的问题! 请各位大哥帮忙看看问题出在哪里!万分感谢!