树型结构带CHECKBOX 请高人指教,立马给分

usernamezero 2009-05-20 12:16:59
带CHECKBOX的树型结构,怎么判断选中了一个节点,
然后让其下所有的子节点也选种,
javascript的方法不用告诉我,不想用,就想用C#的方法,递归或是怎么着的
...全文
408 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxm3630478 2009-05-20
  • 打赏
  • 举报
回复
CSDN 结了的帖子打不开了.........晕了..
yechd 2009-05-20
  • 打赏
  • 举报
回复

protected void TreeView_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
CheckedNodes(e.Node);
}

private void CheckedNodes(TreeNode selectedNode)
{
foreach (TreeNode childNode in selectedNode.ChildNodes)
{
if (selectedNode.Checked)
childNode.Checked = true;
else
childNode.Checked = false;

if (childNode.ChildNodes.Count > 0)
CheckedNodes(childNode);
}
}
whyabc 2009-05-20
  • 打赏
  • 举报
回复
up
sunhuaiwei 2009-05-20
  • 打赏
  • 举报
回复
你这个树形菜单是怎么做的,不是在控件里直接拖出的树形菜单控件吗?那个你选中哪一级他不是就弄到了

你在cs页面不就能做了吗?
nijiushiposhi 2009-05-20
  • 打赏
  • 举报
回复
菜鸟,不会,帮你顶。
yechd 2009-05-20
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.TreeView.Attributes.Add("onclick", "postBackByCheckBox()");
}
}


<script>
function postBackByCheckBox() {
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox") {
__doPostBack("", "");
}
}
</script>
wangxinli_nissan 2009-05-20
  • 打赏
  • 举报
回复
以下代码是我项目中用到的代码:
页面代码
<script type="text/javascript">
// 点击复选框时触发事件
function postBackByObject()
{
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox")
{
__doPostBack("","");
}
}
</script>

后台代码
//节点的CheckBox选中状态改变
protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
SetChildChecked(e.Node);

}
/// <summary>
/// 设置节点的CheckBox选中状态改变时全部子节点的CheckBox的状态
/// </summary>
/// <param name="parentNode"></param>
private void SetChildChecked(TreeNode parentNode)
{
foreach (TreeNode node in parentNode.ChildNodes)
{
node.Checked = parentNode.Checked;
if (node.ChildNodes.Count > 0)
{
SetChildChecked(node);
}
}
SetParentChecked(parentNode);
}
private void SetParentChecked(TreeNode node)
{
if (node.Parent != null && node.Checked)
{
TreeNode parentNode = node.Parent;
parentNode.Checked = node.Checked;
SetParentChecked(parentNode);
}
}
咖啡老猫 2009-05-20
  • 打赏
  • 举报
回复
在C#中你要用使点击了
TreeNodeCheckChanged 事件:我一般是在里面添加了一个API
PostMessage(treeView1.Handle,,1,)
通知选择节点。具体的参数我忘记了。你自己查一下。
zzxap 2009-05-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/jdmei520/archive/2009/01/19/1378439.html
zzxap 2009-05-20
  • 打赏
  • 举报
回复
1 前言
用.Net 做Web应用, 有一个很大的苦恼就是没有太趁手的TreeView可用。微软的TreeView仅用作数据显示还行,但服务器控件不停的刷新太影响客户体验。商业化的TreeView(obout treeview / FlyTreeView / Infragistics NetAdvantage Treeview)都不错,特别是obout treeview短小精干讨人喜欢,但许可证是一个大障碍(公司一般不会花钱买的)。我一般而言,在TreeView上做事情,用checkbox的时候较多,特别是父子节点的关联,因此,对Microsoft TreeView改造就从父子节点的关联开始。

2 ASP.Net 2.0 Treeview 简要分析
ASP.Net 2.0 Treeview吹的很不错,但客户端操作几乎为零。微软实现了一些客户端用的JavaScript TreeView.js,还不公开,藏在system.web.dll中,以资源的方式通过WebResource.axd来向客户端释放。仔细分析一下TreeView.js,会发现微软为TreeView自动生成的Html脚本结构如下:

<div> //树

<table/> //节点

<div/> //节点的子节点,里面的内容是一个或多个<table/><div/>

</div>

因此,准确的说是<table/><div/>构成一个节点,但很难明确的在DOM中确定一个节点,原因如下:

1. 其ID或Name是顺序排列的,命名规则如下: 树ID + “n” + 节点序号,例如 MyTreen0

商业的TreeView一般在ID中包含层次信息,如: MyTreeNode1_1_2 表示树的1.1.2那个节点,分析起来很容易

2. 上面描述的节点命名的ID,是分配给<table/>里的<A/>也就是显示 加号 减号的那个链接元素,由于该元素在<table/>中,因此给分析带来了难度

3. 叶子节点没有上面所描述的<table/>里的那个<A/>, 无法分析(因此我自己JavaScript才会里出现A节点和Input节点,A节点就是有“树ID + “n” + 节点序号”为ID的链接元素,Input节点是<table/>里的Checkbox,命名规则为: 树ID + “n” + 节点序号 + “CheckBox”)

3 自己写JavaScript
没办法,只有自己写JS函数来处理CheckBox的级联操作,其中用到了微软的TreeView.js 和 WebForm.js,下载链接: TreeView2.rar

加入方法如下:
* 为TreeView加入OnClick事件

直接在TreeView的属性上加入:OnClick="OnTreeNodeChecked()"

或者:MyTree.Attributes.Add("OnClick", "OnTreeNodeChecked(event)");

* 这样写OnClick事件动作

<script language =javascript type="text/javascript">
function OnTreeNodeChecked()
{
var element = window.event.srcElement;
if (!IsCheckBox(element))
return;

var isChecked = element.checked;
var tree = TV2_GetTreeById(<%=SubSysTree.ClientID%>);
var node = TV2_GetNode(tree,element);

TV2_SetChildNodesCheckStatus(node,isChecked);

var parent = TV2_GetParentNode(tree,node);
TV2_NodeOnChildNodeCheckedChanged(tree,parent,isChecked);

}
</script>

TreeView2.js 也包含了一些对节点访问函数,可做其他用途。随着我自己需求的增加,我也会逐渐加入其他的一些功能进去。
yangjian0830 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yechangda 的回复:]
C# code
protected void TreeView_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
CheckedNodes(e.Node);
}

private void CheckedNodes(TreeNode selectedNode)
{
foreach (TreeNode childNode in selectedNode.ChildNodes)
{
if (selectedNode.Checked)
childNode.Checked = true;
else
childNode.Checked = false;

if (child…
[/Quote]

如果楼主是直接使用自带的TREEVIEW控件,这个就是正解
zzxap 2009-05-20
  • 打赏
  • 举报
回复
参考
http://www.cnblogs.com/njypcmqj/archive/2007/06/11/779139.html
usernamezero 2009-05-20
  • 打赏
  • 举报
回复
23楼还漏了一句就是在treeview 里边加上一句onclick="OnTreeNodeChecked(this)" 就可以了
usernamezero 2009-05-20
  • 打赏
  • 举报
回复
17楼,21楼,这样的菜鸟,就别上来,瞎叫了,听着就烦人,不想骂人,只想说一句,我日......点的部份自己想吧
usernamezero 2009-05-20
  • 打赏
  • 举报
回复
4 楼的那个方法是可以,但是你点击节点上的checkbox的时候是不会触发事件的
以下是用js实现的你们也看一下吧
/*********************
实现效果:实现treeview checkbox 级联选择效果
来源:FrameWork 基础类
**********************/


function TV2_SetChildNodesCheckStatus(node,isChecked)
{
var childNodes = TV2i_GetChildNodesDiv(node);

if(childNodes == null)
return;

var inputs = WebForm_GetElementsByTagName(childNodes,"INPUT");

if(inputs == null || inputs.length == 0)
return;

for(var i = 0; i < inputs.length; i++)
{
//alert(inputs.length);
if(IsCheckBox(inputs[i]))
inputs[i].checked = isChecked;
}
}

function TV2_NodeOnChildNodeCheckedChanged(tree,node,isChecked)
{
if(node == null)
return;

var childNodes = TV2_GetChildNodes(tree,node);

if(childNodes == null || childNodes.length == 0)
return;

var isAllSame = true;

for(var i = 0; i < childNodes.length; i++)
{
var item = childNodes[i];
var value = TV2_NodeGetChecked(item);
//alert(value);
if(isChecked != value)
{
isAllSame = false;
break;
}
}

// var parent = TV2_GetParentNode(tree,node);
// if(isAllSame)
// {
// return;
// }
// else
// {
// TV2_NodeOnChildNodeCheckedChanged(tree,parent,true);
//
// TV2_NodeSetChecked(node,true);
// }
}


function TV2_GetNode(tree,element)
{
var id = element.id.replace(tree.id,"");
id = id.toLowerCase().replace(element.type,"");
id = tree.id + id;

var node = document.getElementById(id);
if(node == null)
return element;
return node;
}


function TV2_GetParentNode(tree,node)
{
var div = WebForm_GetParentByTagName(node,"DIV");


var table = div.previousSibling;
if(table == null)
return null;

return TV2i_GetNodeInElement(tree,table);
}


function TV2_GetChildNodes(tree,node)
{
if(TV2_NodeIsLeaf(node))
return null;

var children = new Array();
var div = TV2i_GetChildNodesDiv(node);
var index = 0;

for(var i = 0; i < div.childNodes.length; i++)
{
var element = div.childNodes[i];
if(element.tagName != "TABLE")
continue;

var child = TV2i_GetNodeInElement(tree,element);
if(child != null)
children[index++] = child;
}
return children;
}

function TV2_NodeIsLeaf(node)
{
return !(node.tagName == "A");
}

function TV2_NodeGetChecked(node)
{
var checkbox = TV2i_NodeGetCheckBox(node);

return checkbox.checked;
}

function TV2_NodeSetChecked(node,isChecked)
{
var checkbox = TV2i_NodeGetCheckBox(node);
if(checkbox != null)
checkbox.checked = isChecked;
}

function IsCheckBox(element)
{
if(element == null)
return false;
return (element.tagName == "INPUT" && element.type.toLowerCase() == "checkbox");
}


function TV2_GetTreeById(id)
{
return document.getElementById(id);
}


function TV2i_GetChildNodesDiv(node)
{
if(TV2_NodeIsLeaf(node))
return null;

var childNodsDivId = node.id + "Nodes";
//alert(childNodsDivId);
return document.getElementById( childNodsDivId );
}


function TV2i_GetNodeInElement(tree,element)
{
var node = TV2i_GetNodeInElementA(tree,element);
if(node == null)
{
node = TV2i_GetNodeInElementInput(tree,element);
}
return node;
}

function TV2i_GetNodeInElementA(tree,element)
{
var as = WebForm_GetElementsByTagName(element,"A");
if(as== null || as.length == 0)
return null;

var regexp = new RegExp("^" + tree.id + "n\\d+$");

for(var i = 0; i < as.length; i++)
{
if(as[i].id.match(regexp))
{
return as[i];
}
}
return null;
}


function TV2i_GetNodeInElementInput(tree,element)
{
var as = WebForm_GetElementsByTagName(element,"INPUT");
if(as== null || as.length == 0)
return null;

var regexp = new RegExp("^" + tree.id + "n\\d+");

for(var i = 0; i < as.length; i++)
{
if(as[i].id.match(regexp))
{
return as[i];
}
}
return null;
}


function TV2i_NodeGetCheckBox(node)
{
if(IsCheckBox(node))
return node;

var id = node.id + "CheckBox";
return document.getElementById(id);
}
然后在页面上调用这个JS的方法
<script type="text/jscript">
function OnTreeNodeChecked()
{
var element = element = window.event.srcElement;
if (!IsCheckBox(element))
return;

var isChecked = element.checked;
var tree = TV2_GetTreeById("TreeView1");
var node = TV2_GetNode(tree,element);
//alert(node);

TV2_SetChildNodesCheckStatus(node,isChecked);

var parent = TV2_GetParentNode(tree,node);

TV2_NodeOnChildNodeCheckedChanged(tree,parent,isChecked);

}
</script>
ztenv 2009-05-20
  • 打赏
  • 举报
回复
//创建带TreeView控件的窗体时加入此句,挂接treeView的事件:
{
treeView1.AfterCheck += AfterChecked;

}

private void CheckChild(TreeNode Node, bool Checked)//递归选中子结点;
{
foreach (TreeNode tn in Node.Nodes)
{
tn.Checked = Checked;
CheckChild(tn, Checked);
}
}

private void AfterChecked(object sender, TreeViewEventArgs e)
{
treeView1.AfterCheck -= AfterChecked;//自己考虑为什么要加这一句吧

CheckChild(e.Node, e.Node.Checked);

treeView1.AfterCheck += AfterChecked;//还有这一句;
}


经我个人测试,这方法比较高效了,四楼的方法也还行,就是结点一多了(几千或几万个)时,会明显的慢很多;
meheartfly 2009-05-20
  • 打赏
  • 举报
回复
菜鸟,简单的递归都不会,还做什么程序员?改行算了
wl076 2009-05-20
  • 打赏
  • 举报
回复

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default7 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.BiudTree();
//MessageBox.ShowConfirm(this,"abc");
}
}
protected DataTable BindTestData()
{


//模拟出一些原始数据绑定DataGrid
DataTable dt1 = new DataTable("Table1");
dt1.Columns.Add("ts_bm_id");
dt1.Columns.Add("TS_BM_Pid");
dt1.Columns.Add("ts_bm_name");

dt1.Rows.Add(new object[] { 1, 0,"软件公司" });
dt1.Rows.Add(new object[] { 2, 1, "日本总公司"});
dt1.Rows.Add(new object[] { 3, 1, "大连分公司" });
dt1.Rows.Add(new object[] { 4, 2, "日本财务部" });
dt1.Rows.Add(new object[] { 5, 2, "日本销售部" });
dt1.Rows.Add(new object[] { 6, 3, "大连开发部" });
dt1.AcceptChanges();

return dt1;
}
private void BiudTree()
{
DataTable dt = BindTestData();
this.LstBM.Items.Clear();
DataRow[] drs = dt.Select("TS_BM_Pid= " + 0);


foreach (DataRow r in drs)
{
string nodeid = r["ts_bm_id"].ToString();
string text = r["ts_bm_name"].ToString();
text = "╋" + text;
this.LstBM.Items.Add(new ListItem(text, nodeid));
int sonparentid = int.Parse(nodeid);
string blank = "├";

BindNode(sonparentid, dt, blank);

}
this.LstBM.DataBind();

}
private void BindNode(int parentid, DataTable dt, string blank)
{
DataRow[] drs = dt.Select("TS_BM_Pid= " + parentid);

foreach (DataRow r in drs)
{
string nodeid = r["ts_bm_id"].ToString();
string text = r["ts_bm_name"].ToString();
text = blank + "『" + text + "』";

this.LstBM.Items.Add(new ListItem(text, nodeid));
int sonparentid = int.Parse(nodeid);
string blank2 = blank + "─";


BindNode(sonparentid, dt, blank2);
}
}

}


s32702 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yechangda 的回复:]
C# code
protected void TreeView_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
CheckedNodes(e.Node);
}

private void CheckedNodes(TreeNode selectedNode)
{
foreach (TreeNode childNode in selectedNode.ChildNodes)
{
if (selectedNode.Checked)
childNode.Checked = true;
else
childNode.Checked = false;

if (child…
[/Quote]

传说中的递归就是这么写的
usernamezero 2009-05-20
  • 打赏
  • 举报
回复
17楼的也不用骗人吧,就跟你会是的,哎无言了
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧