您的位置:首页 > 其它

树节点移动操作----使用微软treeview控件

2005-08-16 22:18 851 查看
树节点移动操作[/b]
[/b]

----[/b]使用微软[/b]treeview[/b]控件[/b]
[/b]

作者:pfengkMSN: pfengk@hotmail.com更多文章请访问:http://www.cnblogs.com/pfengk/

目录[/b]
[/b]

概述................................................................................................................................. 1

操作演示.......................................................................................................................... 1

实现源码:[C#]................................................................................................................ 2

概述

本文集中体现树节点移动实现代码其中很多其他代码省略。如果你对treeview控件不了解,请参阅我的另外一篇文章《web方式下权限分配简单实现》。 源码中引用命名空间Microsoft.Web.UI.WebControls。

本文描述节点移动算法效率非常低下,仅仅适合于节点不多的情况下使用。还请高手们多多指教。联系我的msn,谢谢你们!

操作演示

窗体载入初始界面
[/b]







选择节点之后
[/b]







点击[[/b]赋予][/b]按钮之后
[/b]







再次点击[[/b]赋予][/b]按钮之后
[/b]

实现源码:[C#]

1



"一棵树到另一棵树的 节点移动方法"#region "一棵树到另一棵树的 节点移动方法"
2


3



/**//// <summary>
4


5

/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
6


7

/// </summary>
8


9

/// <param name="childTreeNode"></param>
10


11

/// <param name="parentTreeNode"></param>
12


13

/// <returns></returns>
14


15

public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView)
16


17





{
18


19

bool returnValue = false;
20


21


22


23

foreach(TreeNode tempTreeNode in parentTreeView.Nodes)
24


25





{
26


27

if (childTreeNode.Text == tempTreeNode.Text)
28


29





{
30


31

returnValue = true;
32


33

break;
34


35

}
36


37

}
38


39

return returnValue;
40


41

}
42


43


44


45



/**//// <summary>
46


47

/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
48


49

/// </summary>
50


51

/// <param name="childTreeNode"></param>
52


53

/// <param name="parentTreeNode"></param>
54


55

/// <returns></returns>
56


57

public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView,ref TreeNode foundTreeNode)
58


59





{
60


61

bool returnValue = false;
62


63


64


65

foreach(TreeNode tempTreeNode in parentTreeView.Nodes)
66


67





{
68


69

if (childTreeNode.Text == tempTreeNode.Text)
70


71





{
72


73

returnValue = true;
74


75

foundTreeNode = tempTreeNode;
76


77

break;
78


79

}
80


81

}
82


83

return returnValue;
84


85

}
86


87


88


89



/**//// <summary>
90


91

/// 从parentTreeNode(根节点)的所有节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
92


93

/// </summary>
94


95

/// <param name="childTreeNode"></param>
96


97

/// <param name="parentTreeNode"></param>
98


99

/// <returns></returns>
100


101

public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode)
102


103





{
104


105

bool returnValue = false;
106


107


108


109

foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)
110


111





{
112


113

if (childTreeNode.Text == tempTreeNode.Text)
114


115





{
116


117

returnValue = true;
118


119

break;
120


121

}
122


123

}
124


125

return returnValue;
126


127

}
128


129


130


131



/**//// <summary>
132


133

/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
134


135

/// </summary>
136


137

/// <param name="childTreeNode"></param>
138


139

/// <param name="parentTreeNode"></param>
140


141

/// <returns></returns>
142


143

public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode,ref TreeNode foundTreeNode)
144


145





{
146


147

bool returnValue = false;
148


149


150


151

foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)
152


153





{
154


155

if (childTreeNode.Text == tempTreeNode.Text)
156


157





{
158


159

returnValue = true;
160


161

foundTreeNode = tempTreeNode;
162


163

break;
164


165

}
166


167

}
168


169

return returnValue;
170


171

}
172


173


174


175



/**//// <summary>
176


177

/// 移除叶子节点。首先判断是否为叶子节点或根节点,是则移除,否则跳出返回
178


179

/// </summary>
180


181

/// <param name="treeNode"></param>
182


183

/// <returns></returns>
184


185

public bool RemoveLeafageChildNode(ref TreeNode treeNode)
186


187





{
188


189

bool returnValue = false;
190


191

if (treeNode.Nodes == null | treeNode.Nodes.Count == 0)
192


193





{//是子节点时候
194


195

if (treeNode.Parent is TreeNode)
196


197





{//父节点为节点类型时
198


199

int nodesCount = ((TreeNode)treeNode.Parent).Nodes.Count;
200


201

if (nodesCount > 1)
202


203





{//还有兄弟叶子节点时候,仅仅删除本节点
204


205

treeNode.Remove();
206


207

returnValue = true;
208


209

}
210


211

else
212


213





{//是唯一叶子节点时候,还要删除父节点
214


215

//删除本节点
216


217

TreeNode thisParentTreeNode = (TreeNode)treeNode.Parent;
218


219

treeNode.Remove();
220


221

//删除父节点
222


223

returnValue = RemoveLeafageChildNode(ref thisParentTreeNode);
224


225

}
226


227

}
228


229

else
230


231





{//父节点不为节点类型时,他一定是根节点
232


233

treeNode.Remove();
234


235

returnValue = true;
236


237

}
238


239

}
240


241

return returnValue;
242


243

}
244


245


246


247



/**//// <summary>
248


249

/// 【MoveNodes】将节点分支中所有被选中的节点,移动到另外一个节点分支上。前提根节点必须保留,且各节点Text值唯一。
250


251

/// </summary>
252


253

/// <param name="fromTreeView"></param>
254


255

/// <param name="toTreeNode"></param>
256


257

public void MoveNodes(ref TreeNode fromTreeNode,ref TreeNode toTreeNode)
258


259





{
260


261

bool selected = true;
262


263

//遍历fromTreeNode子节点,比较选中子节点在toTreeNode的子节点集中是否存在,不存在则移动子节点;存在跳过
264


265

int h = fromTreeNode.Nodes.Count-1;
266


267

for (int i = h ; i>=0;i--)
268


269





{
270


271

TreeNode rootNode = new TreeNode();
272


273

rootNode = fromTreeNode.Nodes[i];
274


275

//根节点是否被选中,否则跳过。
276


277

if (rootNode.Checked == selected)
278


279





{
280


281

//本节点是否为叶子节点
282


283

bool isDeleted = false;
284


285

//子节点在 toTreeNode中的子节点集 中是否存在
286


287

if (!FindNodeFromChildNodes (rootNode,toTreeNode))
288


289





{
290


291

//移动节点,判断是否为子节点。是子节点则从fromTreeNode中移除,同时判断是否为唯一节点,是同时移除父节点,
292


293

//反之忽略。
294


295

TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
296


297

int k = rootNodeClone.Nodes.Count;
298


299

for(int j=0; j<k;j++)
300


301





{
302


303

rootNodeClone.Nodes.RemoveAt(0);
304


305

}
306


307

toTreeNode.Nodes.Add(rootNodeClone);
308


309


310


311

isDeleted = RemoveLeafageChildNode(ref rootNode);
312


313

}
314


315


316


317

//移动子节点的整个分支
318


319

if (!isDeleted)
320


321





{
322


323

TreeNode toRootNode = new TreeNode();
324


325

//定位toTreeNode中与rootNode相同的节点位置。
326


327

FindNodeFromChildNodes(rootNode,toTreeNode,ref toRootNode);
328


329

//移动fromTreeNode中rootNode的分支中所有选中节点到toTreeNode的toRootNode分支中
330


331

MoveNodes(ref rootNode,ref toRootNode);
332


333

}
334


335

}
336


337

}
338


339

}
340


341



/**//// <summary>
342


343

/// 【MoveNodes】将一棵树中所有被选中的节点,移动到另外一棵树上。前提根节点必须保留,且各节点Text值唯一。
344


345

/// </summary>
346


347

/// <param name="fromTreeNode"></param>
348


349

/// <param name="toTreeNode"></param>
350


351

public void MoveNodes(ref TreeView fromTreeView,ref TreeView toTreeView)
352


353





{
354


355

bool selected = true;
356


357


358


359

//遍历fromTreeView根节点,比较选中节点在toTreeView的根节点集中是否存在,不存在则移动节点;存在跳过
360


361


362


363

int h = fromTreeView.Nodes.Count-1;
364


365

for (int i = h ; i>=0;i--)
366


367





{
368


369

TreeNode rootNode = new TreeNode();
370


371

rootNode = fromTreeView.Nodes[i];
372


373

//根节点是否被选中,否则跳过。
374


375

if (rootNode.Checked == selected)
376


377





{
378


379

//本节点是否为叶子节点
380


381

bool isDeleted = false;
382


383

//根节点在 toTreeView中的根节点中是否存在
384


385

if (!FindNodeFromChildNodes (rootNode,toTreeView))
386


387





{
388


389

//移动节点,判断是否为子节点。是子节点则从fromTreeView中移除,同时判断是否为唯一节点,是同时移除父节点,
390


391

//反之忽略。
392


393

TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
394


395

int k = rootNodeClone.Nodes.Count;
396


397

for(int j=0; j<k;j++)
398


399





{
400


401

rootNodeClone.Nodes.RemoveAt(0);
402


403

}
404


405


406


407

toTreeView.Nodes.Add(rootNodeClone);
408


409


410


411

isDeleted = RemoveLeafageChildNode(ref rootNode);
412


413

}
414


415

//移动根节点的整个分支
416


417

if (!isDeleted)
418


419





{
420


421

TreeNode toRootNode = new TreeNode();
422


423

//定位toTreeView中与rootNode相同的节点位置。
424


425

FindNodeFromChildNodes(rootNode,toTreeView,ref toRootNode);
426


427

//移动fromTreeView中rootNode的分支中所有选中节点到toTreeView的toRootNode分支中
428


429

MoveNodes(ref rootNode,ref toRootNode);
430


431

}
432


433

}
434


435

}
436


437

}
438


439


440


441

#endregion
442


[THE END]
[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐