扩展.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就是设置的值) 第一次遇到这样奇怪的问题! 请各位大哥帮忙看看问题出在哪里!万分感谢!
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就是设置的值) 第一次遇到这样奇怪的问题! 请各位大哥帮忙看看问题出在哪里!万分感谢!
对这里越来越失望!