C# TreeView使用技巧
节点勾选设置
TreeView树中节点勾选要求:
1、不选中一个节点,则其所有的子节点都不被选中。
2、选中一个节点,则其所有的子节点都被选中。
3、当一个节点的所有子节点都没有被选中时,该节点也没有被选中。
4、当一个节点的所有子节点中有一个被选中时,则该节点也被选中。
代码中对事件参数e.Action的判断,可以避免在改变节点的Checked的状态时,再次进入AfterCheck(),这样当在AfterCheck()中有其他逻辑响应时,可以做到每次勾选时,其他逻辑也只响应一次。
参考代码:
private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
{
//通过鼠标或者键盘触发事件,防止修改节点的Checked状态时候再次进入
if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
{
SetChildNodeCheckedState(e.Node, e.Node.Checked);
SetParentNodeCheckedState(e.Node, e.Node.Checked);
}
} //设置子节点状态
private void SetChildNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)
{
if (currNode.Nodes == null) return; //没有子节点返回
foreach (TreeNode tmpNode in currNode.Nodes)
{
tmpNode.Checked = isCheckedOrNot;
SetChildNodeCheckedState(tmpNode, isCheckedOrNot);
}
} //设置父节点状态
private void SetParentNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)
{
if (currNode.Parent == null) return; //没有父节点返回
if (isCheckedOrNot) //如果当前节点被选中,则设置所有父节点都被选中
{
currNode.Parent.Checked = isCheckedOrNot;
SetParentNodeCheckedState(currNode.Parent, isCheckedOrNot);
}
else //如果当前节点没有被选中,则当其父节点的子节点有一个被选中时,父节点被选中,否则父节点不被选中
{
bool checkedFlag = false;
foreach (TreeNode tmpNode in currNode.Parent.Nodes)
{
if (tmpNode.Checked)
{
checkedFlag = true;
break;
}
}
currNode.Parent.Checked = checkedFlag;
SetParentNodeCheckedState(currNode.Parent, checkedFlag);
}
}
TreeView隐藏部分节点
WinForm中的TreeView没法根据每个节点的情况设置是否有checkbox,只能用CheckBoxes设置整个树是否有Checkbox,可通过如下方式隐藏部分节点的checkbox。
this.treeView1.CheckBoxes = true;
this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
隐藏节点:
void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
//隐藏节点前的checkbox
if (e.Node.Level == || e.Node.Level == )
HideCheckBox(this.treeView1, e.Node);
e.DrawDefault = true;
} [StructLayout(LayoutKind.Sequential, Pack = , CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
} [DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam); private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + ; private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = ;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
TreeView递归加载节点
C#遍历指定文件夹下所有子文件夹及文件并添加到目录树:
private void Form1_Load(object sender, EventArgs e)
{
TreeNode root = new TreeNode();
//根目录名称
root.Text = "目录";
//根目录路径
GetFiles(@"E:\Tools", root);
treeView1.Nodes.Add(root);
} private void GetFiles(string filePath, TreeNode node)
{
DirectoryInfo folder = new DirectoryInfo(filePath);
node.Text = folder.Name;
node.Tag = folder.FullName; FileInfo[] chldFiles = folder.GetFiles("*.*");
foreach (FileInfo chlFile in chldFiles)
{
TreeNode chldNode = new TreeNode();
chldNode.Text = chlFile.Name;
chldNode.Tag = chlFile.FullName;
node.Nodes.Add(chldNode);
} DirectoryInfo[] chldFolders = folder.GetDirectories();
foreach (DirectoryInfo chldFolder in chldFolders)
{
TreeNode chldNode = new TreeNode();
chldNode.Text = folder.Name;
chldNode.Tag = folder.FullName;
node.Nodes.Add(chldNode);
GetFiles(chldFolder.FullName, chldNode);
}
}
C# TreeView使用技巧的更多相关文章
- [WPF实用技巧]如何使WPF的TreeView节点之间有连线
示例代码:TreeViewEx.zip 原文地址:http://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fom ...
- Winform TreeView控件技巧
在开发的时候经常使用treeview控件来显示组织结构啊,目录结构啊,通常会结合属性checkedboxs,来做选中,取消的操作下面是一个选中,取消的小例子,选中节点的时候,如果节点存在子节点,可以选 ...
- winform中treeview中节点选中的技巧
我想实现譬如选择某子节点的时候,父节点会自动选中,如果选择父节点,子节点会全部选中,如果子节点全部不选,父节点也要不选. 贴代码 private void tvwMenu_AfterCheck(obj ...
- Extjs4.2 Tree使用技巧
Extjs4.2 Tree使用技巧小结demo 本案例使用了Ext.Tree.Panel的如下知识点: 1.刷新.重新加载Tree,定位到上次的节点位置 2.Tree的右键操作 3.Extjs4.x ...
- asp.net 第三方UI控件 Telerik KendoUI 之 TreeVIew 的用法记录
一.前台显示 备注:一次性取出所有节点 function loadTreeData() { $.ajax({ type: 'POST', url: '@(Html.UrlHref("Scri ...
- DevExpress使用技巧总结
DevExpress是非常主流的.NET控件,目前全世界和中国都用很多用户使用,不过由于是英文版,初次接触的同学可能会觉得困难,这里就总结DevExpress常见的10个使用技巧. 1.TextEdi ...
- DevExpress 控件使用技巧
DevExpress是非常主流的.NET控件,眼下全世界和中国都用非常多用户使用,只是因为是英文版,初次接触的同学可能会认为困难.这里就总结DevExpress常见的10个使用技巧. 1.TextEd ...
- 【MFC】MFC技巧学习 当做字典来查
MFC技巧学习 摘自:http://www.cnblogs.com/leven20061001/archive/2012/10/17/2728023.html 1."属性页的添加:创建对话框 ...
- Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决
Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决 http://blog.csdn.net/net_boy/archive/2009/11/05/477 ...
随机推荐
- net-snmp5.7.3移植到arm-linux平台
net-snmp5.7.3移植到arm-linux平台 本次交叉编译在ubuntu 15.04 64位系统下进行. 准备工作 在编译移植前有几项准备工作需要完成. 1下载net-snmp 5.7.3源 ...
- Junit 测试 Spring
在测试类上加上@RunWith,和@ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration ...
- phpcms分页用法简介
PHPCMS分页的用法 前面需要有引用的list,代码如下: {pc:content action="lists" catid="11" order=" ...
- TransactionScope类
命名空间:System.Transactons MSDN解释:使代码块成为事务性代码,此类不能被继承. 百度空间:在项目中引用using System.Transaction命名空间.在using 中 ...
- FFmpeg frei0r water 滤镜
FFmpeg frei0r water 滤镜, 在 linux 环境中很流畅,但在 XP 环境中抛出异常 研究一段时间修改了代码,能在 XP 里跑得动. sample.water.avi water. ...
- Xcode 6.3.2 提交APP(Upload Archive)时崩溃的解决办法
最近在上传为客户做的APP时,发现Xcode总会在进行到Upload Archive这一步时崩溃,导致APP上载不了.下面说说网上搜索到的几种解决办法. 方法一 亲测有效,很简单: 1.重新打开Xco ...
- ABAP 权限程序
检查用户销售区域与分销渠道的权限 AUTHORITY-CHECK OBJECT 'V_VBAK_VKO' ID 'VKORG' FIELD wa_all-vkorg ID 'V ...
- 【matlab】随意记录
v = -0.5:0.05:0.5; [x, y] = meshgrid(v); z = sqrt(1.0 - x.^2 - y.^2); mesh(x,y,z); 画一个球的一部分: 2. 求cel ...
- HDU 5831 Rikka with Parenthesis II (贪心) -2016杭电多校联合第8场
题目:传送门. 题意:T组数据,每组给定一个长度n,随后给定一个长度为n的字符串,字符串只包含'('或')',随后交换其中两个位置,必须交换一次也只能交换一次,问能否构成一个合法的括号匹配,就是()( ...
- myeclipse破解
由于内容比较多,我就直接转载了 ,同时感谢原博主 http://blog.itpub.net/27042095/viewspace-1164998/