winform控件treeview只部分节点显示checkbox

happyqiang happyqiang     2022-08-07     665

关键词:

WinForm控件TreeView 只部分节点显示  CheckBox

 

用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示checkbox哪些不显示,可是winform中的treeview只提供一个ShowCheckBoxes 属性,要么全部节点显示checkbox,要不全部不显示,而指定节点没有ShowCheckBox 属性,下面就在winform的treeview中实现BS对应CheckBox 属性的功能 

方法1:

a)       将TreeView的CheckBoxs属性设为false

b)      将TreeView的StateImageList属性关联一个imagelist组件,里面添加checkbox勾选图片和未勾选图片

c)      添加TreeView的NodeMouseClick事件,在事件中使用e.Node.StateImageIndex属性切换显示的图片(根据索引切换),可以创建一个泛型集合,比如List<string>,用于存放已打钩的节点项,从而方便切换打钩图片索引和未打钩图片索引

d)      缺点: 点击树节点所在行的任何位置都会触发NodeMouseClick事件,因为无法触发treeView1_AfterCheck和treeView1_NodeMouseClick事件,所以只能用NodeMouseClick事件

e)       原理: winform中treeview的checkbox项其实是使用图片显示的,选中是打钩的图片,未选中是未打钩的图片,关联的是StateImageList属性(默认为空,使用自带的图片)。所以如果要实现指定treenode显示checkbox,其它treenode不显示checkbox就需要使用TreeNode的StateImageList属性

 

方法2(建议):

  1初始化:

this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView_DrawNode);

:2: 设置条件控制需要显示checkbox

private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
//隐藏节点前的checkbox
if (e.Node.ImageIndex <2)//此处设置前2级节点不显示选择框
HideCheckBox(this.treeView1, e.Node);
e.DrawDefault = true;
}

3:

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 + 63;
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 = 0;

SendMessage(tvw.Handle, TVM_SETITEM,IntPtr.Zero, ref tvi);

}

[StructLayout(LayoutKind.Sequential, Pack = 8, 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);

 

 

//填充内容的代码略

 

就实现了 只显示部分checkbox

 

C#如何在treeview控件winform的所有父子节点中搜索文本

】C#如何在treeview控件winform的所有父子节点中搜索文本【英文标题】:C#Howtosearchatextinallparent&childnodesoftreeviewcontrolwinform【发布时间】:2019-11-0602:53:48【问题描述】:我正在递归搜索所有treeview的父节点和子节点中的文本,但没... 查看详情

winform窗体treeview控件子节点动态添加图片

Treeview控件通过后台访问数据库显示出所有节点信息,后台数据表中其中有一列是存放的图片名称,然后想通过走绝对路径去显示相应的图片,不知道该怎么去做了。在网上搜了很多说用ImageList控件,我也用了,但不知道是自己... 查看详情

如何在vs2005中将mdi父窗口分割成两部分,一边treeview,一边显示子窗口(c#winform)

如题参考技术A使用SplitContainer容器控件或Splitter控件,就可把窗体分割成两部分 参考技术B在mdi父窗口里面先添加个控键容器,再添加treeview试试本回答被提问者采纳 查看详情

winform中treeview怎么让它只显示父节点的checkbox,不显示子节点的。急急,如能解决分大大给

WINFORM中treeView怎么让它只显示父节点的checkbox,不显示(但不禁用)子节点的。急急,如能解决分大大给只是根节点的话简单,构造节点的时候设置一下就是了,如果每一个父节点都要这要的话,得遍历一下吧,凡是下面有子节... 查看详情

winform中使用treeview控件,treeview控件会默认选择最后一个有子节点的节点,怎么解决

Winform中使用treeview控件,控件有很多节点,有的节点含有子节点有的没有,现在要单击一个button按钮实现单击一下选中的节点就上移或者下移一次!怎样保证每次单击按钮,treeview的选中节点始终是第一次选中的那个,不用重新... 查看详情

winform中,treeview如何只展开一级节点

winform中,TreeView如何只展开一级节点(根节点下面的一级)。不是把所有的节点都展开!应该怎么写呢?谢谢!参考技术A如果几点类型如下根节点|--子节点1||--节点11|--子节点2|--节点21如果需要只展开子节点1,2,使用this.TreeViee1.N... 查看详情

c#winform程序中,左侧放treeview,右侧的显示格式不定该怎么做

我要做个类似OA的。右侧的显示方式要根据树中的节点来决定,可以有文本框增加信息,也可以有datagridview来显示数据。要支持各种操作。我想问,这种变化需要怎么做。。。。。放什么控件。这不同的页面该怎么做。需要用到... 查看详情

c#winform给treeview添加图标问题

...种图标。我的程序如下:(事先在imagelist1中放了两个图标)treeView1.Imagelist=imagelist1;foreach(TreeNodenodeintreeView1.Nodes)if(node.Nodes.Count>0)node.ImageIndex=0;elsenode.ImageIndex=1;但是程序运行后,所有节点就只显示索引为0的图标,不知道为什么,... 查看详情

winform中treeview控件,如何设置节点前checkbox,某个节点前有checkbox,某个节点前没有checkbox?

参考技术AtreeView1.Nodes[0].Nodes.Add("1","收件箱",1);treeView1.Nodes[0].Nodes[0].Nodes.Add("2","其它",2);treeView1.Nodes[0].Nodes.Add("1","发件箱",1);treeView1.Nodes[0].Nodes.Add("1","垃圾箱",1);下面2... 查看详情

如何在c#winform窗体的treeview上面添加checkbox复选框

WinForm的TreeView控件和ASP.NET的有一些区别,你设置控件的CheckBoxes属性为true就可以在所有节点上显示复选框了。还有疑问请追问或是Hi参考技术A如果是设计的时候设置,添加列的时候ColumnType属性选择DataGridViewCheckBoxColumn如果是代码... 查看详情

在 C# winforms 应用程序中使用文本框过滤 Treeview

】在C#winforms应用程序中使用文本框过滤Treeview【英文标题】:FilteraTreeviewwithaTextboxinaC#winformsapp【发布时间】:2012-01-0519:34:10【问题描述】:我的C#winform中有一个TreeView。我希望能够通过搜索框添加搜索功能。基本上当用户输入字... 查看详情

c#winform编程自定义combobx控件,将treeview控件嵌入combobox中

...框的时候,让comboBox不显示下拉类别,你动态的生成一个TreeView控件,放到正确的位置,使其看上去像是ComboBox的下拉列表。当这个TreeView失去焦点时自动将其隐藏。上面的方法应该可以实现你要的功能。只是你要完成combobox选择... 查看详情

winform中treeview控件怎样选中父节点时子节点全部展开,选中其他父节点时原先展开的关闭

winform中Treeview控件怎样选中父节点时子节点全部展开,选中其他父节点时原先展开的关闭,就像windows系统的资源管理器一样。要求详细一点。AfterSelect事件中写:首先判断这个节点是不是父节点(NODES有一个NAME属性,你可以写节... 查看详情

winform控件大全,要详细的.

...到ComboBox控件(思想适用于Asp.net和WinForm)C#WinForm开发系列–TreeViewWPF(Winform)中动态创建TreeViewC#中combobox和TreeView控件属性、事件、方法收集c#,winform,webform,treeview,无限级自动生成c#,winform,contextmenutrip,treeview,右键快捷菜单,定位... 查看详情

winform中treeview控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)

privateintdraptype=1;//1:不同级,不为1:拖同级privatevoidtreeView1_ItemDrag(objectsender,ItemDragEventArgse){if(e.Button==MouseButtons.Left){DoDragDrop(e.Item,DragDropEffects.Move);}}privatevoidtreeView1_DragEn 查看详情

c#winform如何实现单击treeview子节点“设置员工信息”打开窗体form1

privatevoidtreeView1_AfterSelect(objectsender,TreeViewEventArgse)//点击树状控件就会生成相应事件if(treeView1.SelectedNode.Text=="设置员工信息")Form2f=newForm2();f.Show();追问谢谢~再问一下“设置员工信息”的Enabled=false的代码怎么写呢?追答不会... 查看详情

Winform:TreeView 节点折叠而不触发节点单击事件

】Winform:TreeView节点折叠而不触发节点单击事件【英文标题】:Winform:TreeViewNodeCollapsewithoutNodeClickeventfiring【发布时间】:2014-11-0216:26:03【问题描述】:我需要防止节点折叠时发生单击事件。我仍然希望节点折叠并隐藏它下面的... 查看详情

c#winform里treeview的使用

刚用treeview好多都找不到,1:我想让terrview,刚运行就处于展开状态2:怎么让treeview单击父节点就打开?3:让treeview节点,右击就选中或者鼠标移上去就选中也可以,有那种效果就行AfterSelect这个事件不行啊1intnodeTotal=tvMain.Nodes.Co... 查看详情