(转)TreeView节点互斥,autopostback=false的方法

本文介绍了一种在 ASP.NET 中使用 JavaScript 控制 TreeView 控件的方法,实现了仅允许一个节点展开的功能,并提供了具体的实现代码。
问题描述:frameset中的TreeView,里面就四个节点,想打开一个后,关闭其它三个节点。
开始是在TreeView1_Expand里写,倒也能用,可要设置autopostback为true,刷新时很难看,就在网上找资料
相关主题如下:
==================
1. "展开时不提交,改变选择节点时才提交"
2. "使TreeView展开一个节点后自动缩回其他所有的已经展开的节点,就是说同一时间内只有一个展开节点"
3. "TreeView展开无闪烁的解决方法"
4. "TreeView专题讨论" 
5. "TreeView JavaScript控制方法研究"
==================
上面有个javascript角本写的不错,可试了半天老是出错。
于是自已写了一个。


<script language="JavaScript"> 
function initTree()

var tree = document.all["TreeView1"]; 
tree.attachEvent("onexpand", SelectedIndexChange); //追加个事件
}
function SelectedIndexChange() 
{
var temp = this.TreeView1.clickedNodeIndex;
var nodes = new Array();
nodes = this.TreeView1.getChildren();
for(i=0;i<nodes.length;i++)
{
if(i!=temp)
{
if(i<10)
nodeIndex = "0"+i;//我这只用到了四个节点的,十个以上的自已试试看吧。
this.TreeView1.getTreeNode(nodeIndex).setAttribute('expanded','false');
}
}
}
</script>
最后在body里写一个
<body onload="initTree();">
就可以用了。

当然也可以像"TreeView专题讨论"中把javascript写在page_load里,不过那样就很麻烦了,
也很容易出错儿。

转载于:https://www.cnblogs.com/wskaihd/archive/2006/10/14/529018.html

<think>我们正在讨论TreeView的两个属性:Dock和CheckBoxes。 1. Dock属性:用于设置控件在其父容器中的停靠方式。DockStyle.Left表示停靠在父容器的左侧,并调整宽度以适应内容,高度会填满父容器的高度(除非有其他停靠控件占据空间)。 2. CheckBoxes属性:布尔值,决定是否在树节点旁边显示复选框。当设置为true时,每个节点前会出现一个复选框,用户可以通过复选框选择节点。 下面分别详细说明这两个属性: ### 1. Dock属性详解 - **作用**:控制控件在父容器(如Form、Panel等)中的布局方式。 - **取值**:为DockStyle枚举值,包括: - `None`:不停靠(默认值),由Location和Size属性决定位置和大小。 - `Top`:停靠到父容器的顶部,宽度填满父容器,高度由控件自身决定(或通过设置高度)。 - `Bottom`:停靠到底部,类似Top。 - `Left`:停靠到左侧,高度填满父容器(在Top和Bottom之间),宽度由控件自身决定(或通过设置宽度)。 - `Right`:停靠到右侧,类似Left。 - `Fill`:填充剩余空间(如果之前有其他停靠控件,则占据剩余空间;如果没有,则填满整个父容器)。 - **使用场景**:在需要类似资源管理器的界面时,通常将TreeView停靠在左侧(Dock=Left),ListView停靠在右侧(Dock=Fill)以填满剩余空间。 示例代码(在窗体构造函数中设置): ```csharp public Form1() { InitializeComponent(); treeView1.Dock = DockStyle.Left; // 停靠在左侧 listView1.Dock = DockStyle.Fill; // 填充剩余空间 } ``` 效果:TreeView会占据窗体左侧,宽度为其默认宽度(或通过设置Width属性调整),而ListView会填满窗体剩余区域。 ### 2. CheckBoxes属性详解 - **作用**:决定TreeView节点前是否显示复选框。 - **取值**:布尔值(bool),true表示显示复选框,false表示不显示(默认)。 - **使用场景**:当需要用户从树结构中选择多个节点(尤其是多选)时,使用复选框可以直观地让用户勾选。例如,在权限设置、批量操作等场景中。 示例代码(设置TreeView显示复选框): ```csharp treeView1.CheckBoxes = true; // 显示复选框 ``` 注意事项: - 复选框的选中状态由节点的`Checked`属性控制。 - 可以通过`AfterCheck`事件来响应节点复选框状态的变化。 - 如果节点有子节点,默认情况下,选中父节点的复选框会同时选中所有子节点(同样,取消选中父节点也会取消所有子节点)。但是,这个行为可以通过事件处理来修改。 示例:处理节点复选框状态变化事件 ```csharp private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { // 避免递归调用(因为修改子节点会再次触发此事件) treeView1.AfterCheck -= treeView1_AfterCheck; // 如果当前节点被选中,则选中所有子节点 SetChildrenChecked(e.Node, e.Node.Checked); // 重新挂接事件 treeView1.AfterCheck += treeView1_AfterCheck; } private void SetChildrenChecked(TreeNode node, bool isChecked) { foreach (TreeNode child in node.Nodes) { child.Checked = isChecked; // 递归设置子节点 SetChildrenChecked(child, isChecked); } } ``` 注意:上面的示例中,我们通过递归设置了所有子节点的选中状态。同时,为了避免事件递归,我们在处理过程中暂时移除了事件处理程序,处理完再重新挂接。 ### 总结 - `Dock`属性:用于布局,控制控件在容器中的停靠位置。 - `CheckBoxes`属性:用于功能,提供复选框以便用户进行多选操作。 通过这两个属性的组合,可以构建出功能丰富且界面友好的树形结构界面。 §§相关问题§§ 1. TreeView控件中如何实现节点的动态加载(延迟加载)? 2. 如何通过代码设置TreeView节点的展开/折叠状态? 3. 如何自定义TreeView节点的图标(根据节点类型显示不同图标)? 4. 在ListView控件中如何实现多列显示(Details视图)? 5. TreeView节点选中事件(AfterSelect)和复选框事件(AfterCheck)有什么区别?</think>### C# TreeView 的 `Dock` 和 `CheckBoxes` 属性详解 #### 一、`Dock` 属性详解 `Dock` 属性控制控件在父容器中的停靠位置,属于 `DockStyle` 枚举类型。常用值: | 值 | 作用描述 | |---------------|------------------------------------------------------------------------| | `DockStyle.Left` | 控件停靠在父容器**左侧**,高度自动填充容器高度,宽度由控件自身决定(或通过`Width`设置) | | `DockStyle.Right` | 停靠右侧,行为同左侧 | | `DockStyle.Top` | 停靠顶部,宽度填充容器宽度 | | `DockStyle.Bottom` | 停靠底部,宽度填充容器宽度 | | `DockStyle.Fill` | 填充剩余空间(常用于主内容区域) | **典型用法示例**: ```csharp // 创建类似资源管理器的布局 treeView1.Dock = DockStyle.Left; // 树视图停靠左侧 listView1.Dock = DockStyle.Fill; // 列表视图填充剩余空间 splitContainer1.Dock = DockStyle.Fill; // 分割容器填充窗体 ``` **布局效果**: ``` +-------------------------------+ | [TreeView] | | (固定宽度) | | | +---------------+---------------+ | | | | TreeView | ListView | | (Left) | (Fill) | | | | +---------------+---------------+ ``` #### 二、`CheckBoxes` 属性详解 `CheckBoxes` 是布尔属性,控制是否在节点前显示复选框: | 值 | 效果描述 | 典型应用场景 | |--------|----------------------------|------------------------------| | `true` | 每个节点前显示复选框 | 多选操作(如批量删除、权限配置) | | `false` | 不显示复选框(默认值) | 单选导航(如文件浏览器) | **核心功能实现**: ```csharp // 启用复选框 treeView1.CheckBoxes = true; // 处理复选框状态变化事件 private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Node.Checked) { MessageBox.Show($"选中节点: {e.Node.Text}"); // 自动选中所有子节点(可选) foreach (TreeNode child in e.Node.Nodes) { child.Checked = true; } } } ``` **复选框联动逻辑**: ```csharp // 递归设置子节点状态 private void SetChildrenChecked(TreeNode node, bool isChecked) { foreach (TreeNode child in node.Nodes) { child.Checked = isChecked; SetChildrenChecked(child, isChecked); // 递归处理 } } // 获取所有选中的节点 public List<TreeNode> GetCheckedNodes() { var checkedNodes = new List<TreeNode>(); foreach (TreeNode node in treeView1.Nodes) { if (node.Checked) checkedNodes.Add(node); CollectCheckedNodes(node, checkedNodes); // 递归收集 } return checkedNodes; } ``` #### 三、完整应用示例 ```csharp public class MainForm : Form { public MainForm() { // 创建TreeView TreeView treeView = new TreeView { Dock = DockStyle.Left, Width = 200, CheckBoxes = true // 启用复选框 }; // 添加示例节点 TreeNode root = new TreeNode("根节点"); root.Nodes.Add("子节点1"); root.Nodes.Add("子节点2"); treeView.Nodes.Add(root); // 注册事件 treeView.AfterCheck += TreeView_AfterCheck; Controls.Add(treeView); } private void TreeView_AfterCheck(object sender, TreeViewEventArgs e) { // 实现父节点选中时自动选中子节点 SetChildrenChecked(e.Node, e.Node.Checked); } } ``` #### 四、属性组合应用场景 1. **文件管理系统** `Dock=Left` + `CheckBoxes=false`:左侧目录树导航 2. **权限配置工具** `Dock=Fill` + `CheckBoxes=true`:全屏显示带复选框的权限树 3. **多选分类器** `Dock=Right` + `CheckBoxes=true`:右侧显示带复选框的分类树 > 注意:启用`CheckBoxes`时,节点点击区域会分成文本区和复选框区,需在事件中区分点击位置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值