扩展 TreeView 实现选择 CheckBox 自动回发

天**** 有一网友提出这样的需求:实现点击 TreeView 的 CheckBox 即自动 PostBack
http://community.****.net/Expert/TopicView3.asp?id=5708685

解决方案可以考虑:
1. 在客户端手动通过 js 捕获 checkbox 的 click 事件,然后显示的执行 __doPostBack 方法
对于如何捕获事件,获取目标节点,与类似 TreeView几个小技巧 提到的 父子节点CheckBox的级联选择 类似

2. 扩展 TreeNode(继承 System.Web.UI.WebControls.TreeNode)
然而 TreeNode 并未继承自 System.Web.UI.Control,故而无法访问 checkbox 自控件,其无 Render 之类的方法。虽然它对控件开发者提供了 RenderPreText RenderPostText 方法,分别在节点前、后添加自定义信息,但还是无法访问 CheckBox。

看来此路暂时不通扩展 TreeView 实现选择 CheckBox 自动回发

3. 扩展 TreeView,重写 Render,通过 HtmlTextWriter 获取呈现的 html 代码,并想办法遍历其中的 <input type=checkbox /> 为其添加 onclick=_doPostBack

经测试此法,我看行 扩展 TreeView 实现选择 CheckBox 自动回发

XTreeView.cs
扩展 TreeView 实现选择 CheckBox 自动回发usingSystem;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Data;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Configuration;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.IO;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Text;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Text.RegularExpressions;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web.Security;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web.UI;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web.UI.WebControls;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web.UI.WebControls.WebParts;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Web.UI.HtmlControls;
扩展 TreeView 实现选择 CheckBox 自动回发
usingSystem.Xml;
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
namespaceDigdotnet.Test
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发{
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
/**////<summary>
扩展 TreeView 实现选择 CheckBox 自动回发
///XTreeView的摘要说明
扩展 TreeView 实现选择 CheckBox 自动回发
///</summary>

扩展 TreeView 实现选择 CheckBox 自动回发publicclassXTreeView:TreeView
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发{
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
/**////<summary>
扩展 TreeView 实现选择 CheckBox 自动回发
///为checkbox添加客户端事件click处理程序。
扩展 TreeView 实现选择 CheckBox 自动回发
///<remarks>
扩展 TreeView 实现选择 CheckBox 自动回发
///
扩展 TreeView 实现选择 CheckBox 自动回发
///默认TreeView节点呈现为
扩展 TreeView 实现选择 CheckBox 自动回发
///<inputtype="checkbox"name="TreeView1n2CheckBox"id="TreeView1n2CheckBox"title="1.1.1"/>
扩展 TreeView 实现选择 CheckBox 自动回发
///<aclass="TreeView1_0"href="javascript:__doPostBack('TreeView1','s1//1.1//1.1.1')"onclick="TreeView_SelectNode(TreeView1_Data,this,'TreeView1t2');"id="TreeView1t2">1.1.1</a>
扩展 TreeView 实现选择 CheckBox 自动回发
///
扩展 TreeView 实现选择 CheckBox 自动回发
///重写Render方法之后呈现为
扩展 TreeView 实现选择 CheckBox 自动回发
///<inputtype="checkbox"name="TreeView1n2CheckBox"id="TreeView1n2CheckBox"onclick="TreeView_SelectNode(TreeView1_Data,this.nextSibling,'TreeView1t2');__doPostBack('TreeView1','s1//1.1//1.1.1')"title="1.1.1"/>
扩展 TreeView 实现选择 CheckBox 自动回发
///<aclass="TreeView1_0"href="javascript:__doPostBack('TreeView1','s1//1.1//1.1.1')"onclick="TreeView_SelectNode(TreeView1_Data,this,'TreeView1t2');"id="TreeView1t2">1.1.1</a>
扩展 TreeView 实现选择 CheckBox 自动回发
///
扩展 TreeView 实现选择 CheckBox 自动回发
///</remarks>
扩展 TreeView 实现选择 CheckBox 自动回发
///</summary>
扩展 TreeView 实现选择 CheckBox 自动回发
///<paramname="writer"></param>

扩展 TreeView 实现选择 CheckBox 自动回发protectedoverridevoidRender(HtmlTextWriterwriter)
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发{
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
if(DesignMode)扩展 TreeView 实现选择 CheckBox 自动回发{//设计时,不做处理
扩展 TreeView 实现选择 CheckBox 自动回发
base.Render(writer);
扩展 TreeView 实现选择 CheckBox 自动回发
return;
扩展 TreeView 实现选择 CheckBox 自动回发}

扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
//
扩展 TreeView 实现选择 CheckBox 自动回发
StringWritersw=newStringWriter();
扩展 TreeView 实现选择 CheckBox 自动回发HtmlTextWriterhtmlWriter
=newHtmlTextWriter(sw);
扩展 TreeView 实现选择 CheckBox 自动回发
//输出TreeView的html源码
扩展 TreeView 实现选择 CheckBox 自动回发
base.Render(htmlWriter);
扩展 TreeView 实现选择 CheckBox 自动回发
//
扩展 TreeView 实现选择 CheckBox 自动回发
sw.Flush();
扩展 TreeView 实现选择 CheckBox 自动回发
stringtreeHtml=sw.ToString();
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
//从节点的<a/>标记中分析href和onclick属性中的两个js函数,
扩展 TreeView 实现选择 CheckBox 自动回发
//并插入checkbox的onclick事件
扩展 TreeView 实现选择 CheckBox 自动回发
stringpattern=@"<input.*(id=.*)title=.*/>[/n/r/s]*<a.*href=.*(__doPostBack.*)"".*onclick=.*(TreeView_SelectNode.*);"".*id=.*"">";
扩展 TreeView 实现选择 CheckBox 自动回发Matchmatch
=Regex.Match(treeHtml,pattern);
扩展 TreeView 实现选择 CheckBox 自动回发
//正则替换
扩展 TreeView 实现选择 CheckBox 自动回发
treeHtml=Regex.Replace(treeHtml,pattern,newMatchEvaluator(ReplaceTextCallback));
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
//呈现经过处理的TreeView
扩展 TreeView 实现选择 CheckBox 自动回发
writer=newHtmlTextWriter(Context.Response.Output);
扩展 TreeView 实现选择 CheckBox 自动回发writer.Write(treeHtml);
扩展 TreeView 实现选择 CheckBox 自动回发}

扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
/**////<summary>
扩展 TreeView 实现选择 CheckBox 自动回发
///正则替换回调方法。
扩展 TreeView 实现选择 CheckBox 自动回发
///</summary>
扩展 TreeView 实现选择 CheckBox 自动回发
///<paramname="match"></param>
扩展 TreeView 实现选择 CheckBox 自动回发
///<returns></returns>

扩展 TreeView 实现选择 CheckBox 自动回发privatestaticstringReplaceTextCallback(Matchmatch)
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发{
扩展 TreeView 实现选择 CheckBox 自动回发
intpos=match.Value.IndexOf(match.Groups[1].Value)+match.Groups[1].Value.Length+1;
扩展 TreeView 实现选择 CheckBox 自动回发
returnmatch.Value.Insert(pos,String.Format(@"onclick=""{0};{1}""",match.Groups[3].Value.Replace("this","this.nextSibling"),match.Groups[2].Value));
扩展 TreeView 实现选择 CheckBox 自动回发}

扩展 TreeView 实现选择 CheckBox 自动回发}

扩展 TreeView 实现选择 CheckBox 自动回发}


测试页面

扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发<%扩展 TreeView 实现选择 CheckBox 自动回发@PageLanguage="C#"%>
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
<%扩展 TreeView 实现选择 CheckBox 自动回发@RegisterTagPrefix="ddntest"Namespace="Digdotnet.Test"%>
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
<scriptrunat="server">扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发protected
voidTreeView1_TreeNodeCheckChanged(objectsender,TreeNodeEventArgse)
扩展 TreeView 实现选择 CheckBox 自动回发扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发{
扩展 TreeView 实现选择 CheckBox 自动回发Label1.Text
=String.Format("Youcheckthenodewhose<fontcolor='red'>Text={0}andValuePath={1}</font>",e.Node.Text,e.Node.ValuePath);
扩展 TreeView 实现选择 CheckBox 自动回发}

扩展 TreeView 实现选择 CheckBox 自动回发
</script>
扩展 TreeView 实现选择 CheckBox 自动回发
扩展 TreeView 实现选择 CheckBox 自动回发
<htmlxmlns="http://www.w3.org/1999/xhtml">
扩展 TreeView 实现选择 CheckBox 自动回发
<headrunat="server">
扩展 TreeView 实现选择 CheckBox 自动回发
<title>扩展TreeView实现选择CheckBox自动回发</title>
扩展 TreeView 实现选择 CheckBox 自动回发
</head>
扩展 TreeView 实现选择 CheckBox 自动回发
<body>
扩展 TreeView 实现选择 CheckBox 自动回发
<formid="form1"runat="server">
扩展 TreeView 实现选择 CheckBox 自动回发
<div>
扩展 TreeView 实现选择 CheckBox 自动回发
<h1>扩展TreeView实现选择CheckBox自动回发</h1>
扩展 TreeView 实现选择 CheckBox 自动回发
<inputtype="button"value="Refresh"onclick="location.href=location.href"/>
扩展 TreeView 实现选择 CheckBox 自动回发
<ddntest:XTreeViewid="TreeView1"runat="server"ShowCheckBoxes="All"OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged">
扩展 TreeView 实现选择 CheckBox 自动回发
<Nodes>
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="1">
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="1.1">
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="1.1.1"></asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
</asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
</asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="2">
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="2.1">
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:TreeNodeText="2.2.1"></asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
</asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
</asp:TreeNode>
扩展 TreeView 实现选择 CheckBox 自动回发
</Nodes>
扩展 TreeView 实现选择 CheckBox 自动回发
</ddntest:XTreeView>
扩展 TreeView 实现选择 CheckBox 自动回发
<asp:LabelID="Label1"runat="server"></asp:Label>
扩展 TreeView 实现选择 CheckBox 自动回发
</div>
扩展 TreeView 实现选择 CheckBox 自动回发
</form>
扩展 TreeView 实现选择 CheckBox 自动回发
</body>
扩展 TreeView 实现选择 CheckBox 自动回发
</html>
扩展 TreeView 实现选择 CheckBox 自动回发

测试效果
扩展 TreeView 实现选择 CheckBox 自动回发

BTW,对于 AJAX 大肆流行的今天, PostBack 似乎大家都敬而远之,是否需要此功能,还是看个人应用实际需求了。