asp.net TreeView 选中子节点后父节点自动选择

jialinniao 2010-12-13 10:56:20
如题:我想在TreeView中 选中子节点中的其中一个后父节点自动选择,但是选择了父节点,子节点却不用自动选择。。。。。。
...全文
985 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
上官云峰 2010-12-14
  • 打赏
  • 举报
回复
全后台代码
protected void TreeView2_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
SetChildChecked(e.Node);
if (e.Node.Parent != null)
{
SetParentChecked(e.Node);
}
}
/// <summary>

/// 根据子节点情况来选择父节点

/// </summary>

/// <param name="childNode"></param>
private void SetParentChecked(TreeNode childNode)
{
if (childNode.Parent != null)
{
TreeNode parentNode = childNode.Parent;
if (!parentNode.Checked && childNode.Checked)
{
parentNode.Checked = true;
if (parentNode.Parent != null)
{
SetParentChecked(parentNode);
}
}

else if (parentNode.Checked && !childNode.Checked)
{
int checks = 0;
foreach (TreeNode node in parentNode.ChildNodes)
{
if (node.Checked)
{
checks++;
break;
}
}

if (checks == 0)
{
parentNode.Checked = false;
if (parentNode.Parent != null)
{
SetParentChecked(parentNode);
}
}

}
}

}
/// <summary>

/// 根据父节点情况来选择子节点

/// </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);
}
}

}
jialinniao 2010-12-13
  • 打赏
  • 举报
回复
呵呵,如果要在后台写呢,该如何写
-小蕾- 2010-12-13
  • 打赏
  • 举报
回复

//这里是JQuery的语法,给TreeView控件的CheckBox加载事件
//当选中父节点时,子节点全选中;当不选择父节点,但选择一个子节点时,父节点默认也选中
<script>
$(document).ready(function()
{
var funcStr="$(\":checkbox\").click(function(){CheckedChildNode(this);});";
eval(funcStr);
});
function valid()
{
var ids="";
for(var i=0;i<$("input:checked").size();i++)
{
ids+=$("input:checked").eq(i).val()+",";
}
if(ids=="")
{
return confirm("没选中任何信息,是否继续?");
}
return true;
}

function CheckedChildNode(obj)
{
var divs = obj.parentElement.parentElement.parentElement.parentElement.nextSibling;
if(divs!=null && divs.tagName=="DIV")
{
divs=divs.getElementsByTagName("input");
for(var i=0;i<divs.length;i++)
{
if(divs[i].type=="checkbox")
{
divs[i].checked=obj.checked;
}
}
}
if(obj.checked)
{
divs = obj.parentElement.parentElement.parentElement.parentElement.parentElement.previousSibling;
var ips=divs.getElementsByTagName("input");
for(var i=0;i<ips.length;i++)
{
if(ips[i].type=="checkbox")
{
ips[i].checked=obj.checked;
}
}
while(divs.parentElement!=null)
{
divs=divs.parentElement;
if(divs!=null && divs.tagName=="DIV")
{
divs=divs.previousSibling;
var ips=divs.getElementsByTagName("input");
for(var i=0;i<ips.length;i++)
{
if(ips[i].type=="checkbox")
{
ips[i].checked=obj.checked;
}
}
}
}
}
}
</script>

ly520dreaming 2010-12-13
  • 打赏
  • 举报
回复
function CheckOnly(paramId)
{
var items = document.getElementsByTagName("input");
for(i=0; i<items.length;i++)
{
var e = items[i];
var eId = e.id;
var m = eId.indexOf('_chk');
var n = paramId.indexOf('_chk');
//判断控件类型是否是checkbox,父子节点Id是否匹配,以控制只选中该子节点对应的父节点
if(eId.substring(0,m) == paramId.substring(0,n) && e.type=='checkbox')
{
if(eId.indexOf('chkParentMenu')!=-1){document.getElementById(eId).checked =true;}
}
}
}
dianjixue1 2010-12-13
  • 打赏
  • 举报
回复
忘了加onclick事件了
tvButtons.Attributes.Add("onclick", "getcheck(event)");
dianjixue1 2010-12-13
  • 打赏
  • 举报
回复
之前做过一个,现在已经不记得为什么要那么做了。

TreeView选中事件要用前台处理,否则.net自动回发,点一下TreeView刷新一下。主要是用JavaScript脚本。

<script type="text/javascript">
// 点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox") {
__doPostBack("", "");
}
}

function getcheck(evt) {
//var o = window.event.srcElement;
var o = window.event ? window.event.srcElement : evt.target;

if (o.tagName == "INPUT" && o.type == "checkbox") //点击treeview的checkbox是触发
{
var d = o.id; //获得当前checkbox的id;

var e = d.replace("CheckBox", "Nodes"); //通过查看脚本信息,获得包含所有子节点div的id

var div = window.document.getElementById(e); //获得div对象
if (div != null) //如果不为空则表示,存在子节点
{
var check = div.getElementsByTagName("INPUT"); //获得div中所有的已input开始的标记
for (i = 0; i < check.length; i++) {
if (check[i].type == "checkbox") //如果是checkbox
{
if (!o.checked)
check[i].checked = o.checked; //子节点的状态和父节点的状态相同,即达到全不选
}

}

}

//else //点子节点的时候,使父节点的状态改变,即不为全选
//{
//处理父节点
var divid = o.parentElement.parentElement.parentElement.parentElement.parentElement; //子节点所在的div

while (divid != null) {

var id = divid.id.replace("Nodes", "CheckBox"); //获得根节点的id
if (window.document.getElementById(id) != null) {
window.document.getElementById(id).checked = true;
divid = window.document.getElementById(id).parentElement.parentElement.parentElement.parentElement.parentElement;
}
else {
divid = null;
}
}

}
else {
if (o.tagName == "IMG") {
return true;
}
else {
foo = o;

var sb = o.previousSibling;
if (sb.tagName == "INPUT") {
var imgPlus = document.getElementById(sb.id.replace(/CheckBox/gi, ""));
if (imgPlus) {
eval(imgPlus.href)
}
}
if (window.event) {
window.event.returnValue = false;
return false;
}
else {
evt.preventDefault();
evt.stopPropagation();
}
}



}

}





后台代码把TreeView画好。
提交时获取选中节点:

foreach (TreeNode chkNode in TreeView1.CheckedNodes)
{
.....
}
上官云峰 2010-12-13
  • 打赏
  • 举报
回复
你这个就是级联选的问题吧
前台代码
/////////////////////
<script>
function setParentState(objNode)
{
var objParentDiv = WebForm_GetParentByTagName(objNode,"div");
if(objParentDiv == null || objParentDiv == "undefined")
return;
var divID = objParentDiv.getAttribute("ID");
var prefix = divID.substring(0,divID.indexOf("Nodes"));
var parentID = prefix + "CheckBox";
var parentChk = document.getElementById(parentID);
if(parentChk == null || parentChk == "undefined")
return;
if (objNode.checked)
{
parentChk.checked = true;
}
else
{
if (isAllChildrenUnChecked(parentChk))
{
parentChk.checked = false;
}
}
setParentState(parentChk);
}
function setChildState(objNode)//设定子控件状态
{
var nodeID = objNode.getAttribute("ID"); //chkBox ID
var prefix = nodeID.substring(0,nodeID.indexOf("CheckBox")); //节点的前缀
var childrenDiv = document.getElementById(prefix + "Nodes");
if(childrenDiv == null || childrenDiv == "undefined")
return ;
var childrenArray = childrenDiv.children; //取得所有子控件
for(var i = 0;i< childrenArray.length;i++)
{
var container = childrenArray[i]; //子控件的容器
var chk = WebForm_GetElementByTagName(container,"input"); //查找Check控件,由于只有一个种Input控件,就是CheckBox
chk.checked = objNode.checked;
setChildState(chk);
}
}
function isAllChildrenUnChecked(objChk)
{
var objChkID = objChk.getAttribute("ID");
var prefix = objChkID.substring(0,objChkID.indexOf("CheckBox")); //节点的前缀
var childrenDiv = document.getElementById(prefix + "Nodes");
if(childrenDiv == null || childrenDiv == "undefined")
return ;
var childrenArray = childrenDiv.children; //取得所有子控件
for(var i = 0;i< childrenArray.length;i++)
{
var container = childrenArray[i]; //子控件的容器
var chk = WebForm_GetElementByTagName(container,"input"); //查找Check控件,由于只有一个种Input控件,就是CheckBox
if (chk.checked)
return false;
}
return true;
}
//触发事件
function HandleCheckEvent()
{
var objNode = event.srcElement;
if(objNode.tagName !="INPUT" || objNode.type!="checkbox")
return;
//设定子Chk状态
setChildState(objNode);
//设定父Chk状态
setParentState(objNode);
}
</script>
/////////////////////

后台代码
TreeView1.Attributes.Add("onclick", "HandleCheckEvent()");
不懂装懂 2010-12-13
  • 打赏
  • 举报
回复
......为什么我记得treeview每次只能选中一个节点

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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