树节点移动操作<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
----使用微软treeview控件
作者:pfengk
MSN: pfengk@hotmail.com
更多文章请访问:http://www.cnblogs.com/pfengk/
目录
概述................................................................................................................................. 1
操作演示.......................................................................................................................... 1
实现源码:[C#]................................................................................................................ 2
本文集中体现树节点移动实现代码其中很多其他代码省略。如果你对treeview控件不了解,请参阅我的另外一篇文章《web方式下权限分配简单实现》。
源码中引用命名空间Microsoft.Web.UI.WebControls。
本文描述节点移动算法效率非常低下,仅仅适合于节点不多的情况下使用。还请高手们多多指教。联系我的msn,谢谢你们!
窗体载入初始界面
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
![050705007.JPG](https://i-blog.csdnimg.cn/blog_migrate/ac242b8f9a30d721bcbaf3ff91166726.jpeg)
选择节点之后
![050705002.JPG](https://i-blog.csdnimg.cn/blog_migrate/9b5b2d6dbcc8f028454c23b69c98d090.jpeg)
点击[赋予]按钮之后
![050705003.JPG](https://i-blog.csdnimg.cn/blog_migrate/4b3c2874fbbc8ed19751f75f1ea520f1.jpeg)
再次点击[赋予]按钮之后
1
"一棵树到另一棵树的 节点移动方法"
#region "一棵树到另一棵树的 节点移动方法"
2![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
3![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
4![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
5
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
6![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
7
/// </summary>
8![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
9
/// <param name="childTreeNode"></param>
10![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
11
/// <param name="parentTreeNode"></param>
12![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
13
/// <returns></returns>
14![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
15
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView)
16![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
19
bool returnValue = false;
20![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
21
22![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
foreach(TreeNode tempTreeNode in parentTreeView.Nodes)
24![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
25![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
26![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
if (childTreeNode.Text == tempTreeNode.Text)
28![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
29![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
31
returnValue = true;
32![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
break;
34![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
35
}
36![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
37
}
38![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
39
return returnValue;
40![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
41
}
42![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
43
44![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
46![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
47
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
48![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
49
/// </summary>
50![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
51
/// <param name="childTreeNode"></param>
52![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
53
/// <param name="parentTreeNode"></param>
54![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
55
/// <returns></returns>
56![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
57
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView,ref TreeNode foundTreeNode)
58![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
59![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
60![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
61
bool returnValue = false;
62![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
63
64![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
65
foreach(TreeNode tempTreeNode in parentTreeView.Nodes)
66![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
67![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
68![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
69
if (childTreeNode.Text == tempTreeNode.Text)
70![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
71![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
73
returnValue = true;
74![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
75
foundTreeNode = tempTreeNode;
76![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
77
break;
78![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
79
}
80![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
81
}
82![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
83
return returnValue;
84![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
85
}
86![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
87
88![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
89![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
90![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
91
/// 从parentTreeNode(根节点)的所有节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
92![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
93
/// </summary>
94![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
95
/// <param name="childTreeNode"></param>
96![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
97
/// <param name="parentTreeNode"></param>
98![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
99
/// <returns></returns>
100![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
101
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode)
102![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
103![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
104![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
105
bool returnValue = false;
106![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
107
108![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
109
foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)
110![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
111![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
112![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
113
if (childTreeNode.Text == tempTreeNode.Text)
114![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
115![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
116![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
117
returnValue = true;
118![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
119
break;
120![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
121
}
122![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
123
}
124![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
125
return returnValue;
126![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
127
}
128![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
129
130![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
131![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
132![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
133
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
134![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
135
/// </summary>
136![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
137
/// <param name="childTreeNode"></param>
138![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
139
/// <param name="parentTreeNode"></param>
140![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
141
/// <returns></returns>
142![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
143
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode,ref TreeNode foundTreeNode)
144![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
145![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
146![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
147
bool returnValue = false;
148![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
149
150![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
151
foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)
152![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
153![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
154![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
155
if (childTreeNode.Text == tempTreeNode.Text)
156![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
157![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
158![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
159
returnValue = true;
160![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
161
foundTreeNode = tempTreeNode;
162![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
163
break;
164![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
165
}
166![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
167
}
168![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
169
return returnValue;
170![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
171
}
172![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
173
174![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
175![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
176![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
177
/// 移除叶子节点。首先判断是否为叶子节点或根节点,是则移除,否则跳出返回
178![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
179
/// </summary>
180![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
181
/// <param name="treeNode"></param>
182![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
183
/// <returns></returns>
184![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
185
public bool RemoveLeafageChildNode(ref TreeNode treeNode)
186![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
187![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
188![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
189
bool returnValue = false;
190![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
191
if (treeNode.Nodes == null | treeNode.Nodes.Count == 0)
192![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
193![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//是子节点时候
194![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
195
if (treeNode.Parent is TreeNode)
196![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
197![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//父节点为节点类型时
198![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
199
int nodesCount = ((TreeNode)treeNode.Parent).Nodes.Count;
200![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
201
if (nodesCount > 1)
202![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
203![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//还有兄弟叶子节点时候,仅仅删除本节点
204![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
205
treeNode.Remove();
206![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
207
returnValue = true;
208![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
209
}
210![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
211
else
212![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
213![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//是唯一叶子节点时候,还要删除父节点
214![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
215
//删除本节点
216![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
217
TreeNode thisParentTreeNode = (TreeNode)treeNode.Parent;
218![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
219
treeNode.Remove();
220![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
221
//删除父节点
222![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
223
returnValue = RemoveLeafageChildNode(ref thisParentTreeNode);
224![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
225
}
226![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
227
}
228![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
229
else
230![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
231![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//父节点不为节点类型时,他一定是根节点
232![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
233
treeNode.Remove();
234![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
235
returnValue = true;
236![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
237
}
238![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
239
}
240![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
241
return returnValue;
242![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
243
}
244![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
245
246![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
247![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
248![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
249
/// 【MoveNodes】将节点分支中所有被选中的节点,移动到另外一个节点分支上。前提根节点必须保留,且各节点Text值唯一。
250![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
251
/// </summary>
252![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
253
/// <param name="fromTreeView"></param>
254![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
255
/// <param name="toTreeNode"></param>
256![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
257
public void MoveNodes(ref TreeNode fromTreeNode,ref TreeNode toTreeNode)
258![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
259![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
260![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
261
bool selected = true;
262![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
263
//遍历fromTreeNode子节点,比较选中子节点在toTreeNode的子节点集中是否存在,不存在则移动子节点;存在跳过
264![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
265
int h = fromTreeNode.Nodes.Count-1;
266![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
267
for (int i = h ; i>=0;i--)
268![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
269![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
270![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
271
TreeNode rootNode = new TreeNode();
272![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
273
rootNode = fromTreeNode.Nodes[i];
274![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
275
//根节点是否被选中,否则跳过。
276![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
277
if (rootNode.Checked == selected)
278![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
279![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
280![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
281
//本节点是否为叶子节点
282![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
283
bool isDeleted = false;
284![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
285
//子节点在 toTreeNode中的子节点集 中是否存在
286![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
287
if (!FindNodeFromChildNodes (rootNode,toTreeNode))
288![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
289![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
290![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
291
//移动节点,判断是否为子节点。是子节点则从fromTreeNode中移除,同时判断是否为唯一节点,是同时移除父节点,
292![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
293
//反之忽略。
294![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
295
TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
296![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
297
int k = rootNodeClone.Nodes.Count;
298![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
299
for(int j=0; j<k;j++)
300![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
301![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
302![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
303
rootNodeClone.Nodes.RemoveAt(0);
304![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
305
}
306![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
307
toTreeNode.Nodes.Add(rootNodeClone);
308![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
309
310![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
311
isDeleted = RemoveLeafageChildNode(ref rootNode);
312![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
313
}
314![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
315
316![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
317
//移动子节点的整个分支
318![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
319
if (!isDeleted)
320![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
321![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
322![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
323
TreeNode toRootNode = new TreeNode();
324![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
325
//定位toTreeNode中与rootNode相同的节点位置。
326![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
327
FindNodeFromChildNodes(rootNode,toTreeNode,ref toRootNode);
328![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
329
//移动fromTreeNode中rootNode的分支中所有选中节点到toTreeNode的toRootNode分支中
330![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
331
MoveNodes(ref rootNode,ref toRootNode);
332![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
333
}
334![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
335
}
336![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
337
}
338![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
339
}
340![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
341![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
342![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
343
/// 【MoveNodes】将一棵树中所有被选中的节点,移动到另外一棵树上。前提根节点必须保留,且各节点Text值唯一。
344![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
345
/// </summary>
346![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
347
/// <param name="fromTreeNode"></param>
348![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
349
/// <param name="toTreeNode"></param>
350![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
351
public void MoveNodes(ref TreeView fromTreeView,ref TreeView toTreeView)
352![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
353![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
354![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
355
bool selected = true;
356![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
357
358![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
359
//遍历fromTreeView根节点,比较选中节点在toTreeView的根节点集中是否存在,不存在则移动节点;存在跳过
360![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
361
362![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
363
int h = fromTreeView.Nodes.Count-1;
364![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
365
for (int i = h ; i>=0;i--)
366![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
367![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
368![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
369
TreeNode rootNode = new TreeNode();
370![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
371
rootNode = fromTreeView.Nodes[i];
372![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
373
//根节点是否被选中,否则跳过。
374![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
375
if (rootNode.Checked == selected)
376![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
377![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
378![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
379
//本节点是否为叶子节点
380![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
381
bool isDeleted = false;
382![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
383
//根节点在 toTreeView中的根节点中是否存在
384![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
385
if (!FindNodeFromChildNodes (rootNode,toTreeView))
386![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
387![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
388![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
389
//移动节点,判断是否为子节点。是子节点则从fromTreeView中移除,同时判断是否为唯一节点,是同时移除父节点,
390![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
391
//反之忽略。
392![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
393
TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
394![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
395
int k = rootNodeClone.Nodes.Count;
396![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
397
for(int j=0; j<k;j++)
398![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
399![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
400![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
401
rootNodeClone.Nodes.RemoveAt(0);
402![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
403
}
404![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
405
406![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
407
toTreeView.Nodes.Add(rootNodeClone);
408![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
409
410![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
411
isDeleted = RemoveLeafageChildNode(ref rootNode);
412![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
413
}
414![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
415
//移动根节点的整个分支
416![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
417
if (!isDeleted)
418![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
419![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
420![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
421
TreeNode toRootNode = new TreeNode();
422![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
423
//定位toTreeView中与rootNode相同的节点位置。
424![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
425
FindNodeFromChildNodes(rootNode,toTreeView,ref toRootNode);
426![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
427
//移动fromTreeView中rootNode的分支中所有选中节点到toTreeView的toRootNode分支中
428![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
429
MoveNodes(ref rootNode,ref toRootNode);
430![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
431
}
432![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
433
}
434![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
435
}
436![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
437
}
438![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
439
440![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
441
#endregion
442
[THE END]