如何在窗体初始化的时候就展开所有TreeView控件的所有节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在窗体初始化的时候就展开所有TreeView控件的所有节点相关的知识,希望对你有一定的参考价值。

利用递归关键的是找出要删除节点的父节点(假如是C),找到父节点C之后继续利用递归找出C的父节点B,找到父节点B之后继续找出B的父节点A.... .... 还需要加一个判断,判断一下 父节点.Parent.Parent 看部分代码:

string parentName="";
private void 删除选中节点ToolStripMenuItem_Click(object sender, EventArgs e)

try

TreeNode node = treeView1.SelectedNode.Parent;
if (ChuLi.deleteNode(NodeId))//这个是我自己定义的方法,大家可以忽略

if (node != null)//如果是子节点不是根节点,那么就展开

parentName = node.Text;
//展开的应该是父节点
ExpandNodes(treeView1.Nodes);//调用-----------------------------------------


else

MessageBox.Show("删除失败!");


catch (Exception ex)

MessageBox.Show(ex.Message);



//遍历所有节点,找出指定节点
private void ExpandNodes(TreeNodeCollection tnodes)

foreach (TreeNode node in tnodes)

if (node.Text == parentname)//比较判断,所以需要知道所选节点的父节点名字:node.Parent.Text

ExpandParentNodes(node.Parent.Nodes);//调用下一个递归方法

ExpandNodes(node.Nodes);



//关键点所在
private void ExpandParentNodes(TreeNodeCollection tnodes)

TreeNode parentNode;
foreach (TreeNode node in tnodes)

parentNode = node;
if (parentNode.Parent != null)

parentNode.Parent.Expand();
if (parentNode.Parent.Parent != null)//判断父节点的父节点是否为空,如果已经达到根节点就是null

ExpandParentNodes(parentNode.Parent.Parent.Nodes);

else
break;//已经达到根节点,退出


参考技术A 我倒是有代码,就怕你看不明白,思路是加check 然后用js来写!给你粘上代码,看不懂的问我!
public class ChosePermission : System.Web.UI.Page

protected Microsoft.Web.UI.WebControls.TreeView TreeView2;
protected System.Web.UI.HtmlControls.HtmlInputHidden checkedNodes;
protected System.Web.UI.WebControls.Button Bt_Save;
AccessMethod amd=new AccessMethod();
private void Page_Load(object sender, System.EventArgs e)

TreeView2.Attributes.Add("oncheck","tree_oncheck(this)");
if (!Page.IsPostBack)

BindTree(TreeView2);


for (int i=0;i<TreeView2.Nodes[0].Nodes.Count;i++)

if(TreeView2.Nodes[0].Nodes[i].Checked)

for (int j=0;j<TreeView2.Nodes[0].Nodes[i].Nodes.Count;j++)

TreeView2.Nodes[0].Nodes[i].Nodes[j].Checked=true;






#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)

//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);


/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()

this.Bt_Save.Click += new System.EventHandler(this.Bt_Save_Click);
this.Load += new System.EventHandler(this.Page_Load);


#endregion

/// <summary>
/// 绑定树的数据
/// </summary>
/// <param name="treeView"></param>
public void BindTree(Microsoft.Web.UI.WebControls.TreeView treeView)

treeView.Nodes.Clear(); // 清空树
TreeNode rootnode = new TreeNode();
rootnode.Text = "权限选择"; // 给节点绑定显示值
rootnode.NodeData = "0"; // 给节点绑定key值
rootnode.Expanded = false; // 默认根结点为展开
rootnode.CheckBox=true;
rootnode.Target = "MainFrame";
treeView.Nodes.Add(rootnode);
CreateRootNode(rootnode);


/// <summary>
/// 创建根节点
/// </summary>
/// <param name="parentnode"></param>
public void CreateRootNode(TreeNode parentnode)

string sqlString="select * from T_UserGroup";

DataTable dataTable=new DataTable();
dataTable=amd.DatabaseDataTable(sqlString);
foreach(DataRow row in dataTable.Rows)

TreeNode tempnode = new TreeNode();
tempnode.Text = row["usergroup_name"].ToString();
tempnode.NodeData = row["usergroup_id"].ToString();
tempnode.CheckBox=true;
tempnode.Expanded = false;
//tempnode.NavigateUrl = row["Url"].ToString();
tempnode.Target = "MainFrame";
parentnode.Nodes.Add(tempnode);
CreateChildNode(tempnode);


/// <summary>
/// 创建孩子节点
/// </summary>
/// <param name="parentnode"></param>
public void CreateChildNode(TreeNode parentnode)

string sqlString="select user_id,user_name from T_User where usergroup_id=" + parentnode.NodeData ;

DataTable dataTable=new DataTable();
dataTable=amd.DatabaseDataTable(sqlString);
foreach(DataRow row in dataTable.Rows)

TreeNode tempnode = new TreeNode();
tempnode.Text = row["user_name"].ToString();
tempnode.NodeData = row["user_id"].ToString();
tempnode.CheckBox=true;
tempnode.Expanded = false;
//tempnode.NavigateUrl = row["Url"].ToString();
tempnode.Target = "MainFrame";
parentnode.Nodes.Add(tempnode);
//CreateChildNode(tempnode,dataTable);



private void Bt_Save_Click(object sender, System.EventArgs e)

string savaId=this.checkedNodes.Value.ToString();



js:
<script language="javascript">

//初始化选中节点
function initchecknode()

//获得需要初始化选择状态的节点的字符串.
var selectedNodes = document.all.checkedNodes.value;
var arrayNodes = new Array();
arrayNodes = selectedNodes.split(",");
var AllRootNode=new Array();
AllRootNode=document.getElementById("TreeView2").getChildren();
//初始化选择的节点
findAndCheckedNodes(AllRootNode,arrayNodes);


//根据已选择的节点的字符串初始化选择的节点
function findAndCheckedNodes(NodeArray,nodeDatas)

//alert(NodeArray.length);
if(parseInt(NodeArray.length)==0)

return;

else

for(var i=0;i<parseInt(NodeArray.length);i++)

var cNode,nodeData;
cNode=NodeArray[i];
////如果该节点在nodeDatas里则初始化checked = true;
nodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.length;j++)

if(nodeDatas[j] == nodeData)

cNode.setAttribute("checked","true");
break;


//如果有子节点,则继续递归
if(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);




//节点的oncheck事件
function tree_oncheck(tree)

var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(node,Pchecked);
document.all.checkedNodes.value="";
document.all.unchecked.value="";
FindCheckedFromNode(TreeView2);

//设置子节点选中
function setcheck(node,Pc)

var i;
var ChildNode=new Array();
ChildNode=node.getChildren();

if(parseInt(ChildNode.length)==0)
return;
else

for(i=0;i<ChildNode.length;i++)

var cNode;
cNode=ChildNode[i];
if(parseInt(cNode.getChildren().length)!=0)
setcheck(cNode,Pc);
cNode.setAttribute("checked",Pc);



//获取所有节点状态
function FindCheckedFromNode(node)

var i = 0;
var nodes = new Array();
nodes = node.getChildren();

for (i = 0; i < nodes.length; i++)

var cNode;
cNode=nodes[i];
if (cNode.getAttribute("checked"))
AddChecked(cNode);
else
AddUnChecked(cNode);

if (parseInt(cNode.getChildren().length) != 0 )

FindCheckedFromNode(cNode);



//添加选中节点
function AddChecked(node)

document.all.checkedNodes.value += node.getAttribute("NodeData");
document.all.checkedNodes.value += ',';

//添加未选中节点
function AddUnChecked(node)

document.all.unchecked.value += node.getAttribute("NodeData");
document.all.unchecked.value += ',';


</script>
另外,站长团上有产品团购,便宜有保证
参考技术B treeView1.ExpandAll(); 参考技术C 你可以加个:
treeview(控件名)点expendAll();
参考技术D treeView1.ExpandAll();就行了,希望能帮到你

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

Treeview控件通过后台访问数据库显示出所有节点信息,后台数据表中其中有一列是存放的图片名称,然后想通过走绝对路径去显示相应的图片,不知道该怎么去做了。在网上搜了很多说用ImageList控件,我也用了,但不知道是自己不会用还怎么回事,最终没有达到自己想要的结果。本人在这方面相当于一个初学者,还望各位高手不吝赐教。谢谢!!下面是我写部分代码的思路:
for (int x = 0; x < tb.Rows.Count; x++)

TreeNode childNode = new TreeNode();
childNode.Text = tb.Rows[x]["us_name"].ToString();
图片绑定代码
node.Nodes.Add(childNode);

树节点的图片要通过imageList 里面的图片才能获得,可以是键值,也可以是索引。我给你个例子。

稍微修改下,你就能用。你可以把Button里面代码包装成一个函数,就可以去添加了

控件就是界面的

后台代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2

    public partial class Form1 : Form
   
        public Form1()
       
            InitializeComponent();
            this.treeView1.ImageList = imagelist;
          
       
        ImageList imagelist = new ImageList();     
        private void button1_Click(object sender, EventArgs e)
       
            try
           
                string filename = this.textBox1.Text.Trim();
                string key = this.textBox2.Text.Trim();
                Image im = Image.FromFile(filename);
                imagelist.Images.Add(key,im);
                string name = this.textBox3.Text.Trim();
                TreeNode tn = new TreeNode(name);
                tn.ImageKey = key;
                this.treeView1.Nodes.Add(tn);
           
            catch
           

           
       
        private void Form1_Load(object sender, EventArgs e)
       

       
   

参考技术A 思路是先将图片放入ImagesList,然后将它作为属性分配给TreeView控件,然后在某个TreeNode节点上指定所需图片的索引下标本回答被提问者采纳

以上是关于如何在窗体初始化的时候就展开所有TreeView控件的所有节点的主要内容,如果未能解决你的问题,请参考以下文章

C# winform treeview 节点展开状态的图标设置

如何在C#Winform窗体的Treeview上面添加CheckBox复选框

如何让treeview所有节点全部展开

.net中如何使treeview只让选中节点展开,其它节点收缩

ASP中关于TreeView控件的问题,怎样展开、收缩所有子节点?

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