王朝网络
分享
 
 
 

树节点移动操作----使用微软treeview控件[原创]

王朝other·作者佚名  2006-01-31
宽屏版  字体: |||超大  

树节点移动操作

----使用微软treeview控件

作者:pfengk

MSN: pfengk@hotmail.com

更多文章请访问:http://www.cnblogs.com/pfengk/

目录

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

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

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

概述本文集中体现树节点移动实现代码其中很多其他代码省略。如果你对treeview控件不了解,请参阅我的另外一篇文章《web方式下权限分配简单实现》。

源码中引用命名空间Microsoft.Web.UI.WebControls。

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

操作演示窗体载入初始界面

选择节点之后

点击[赋予]按钮之后

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

实现源码:[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]

搜索一下相关内容

搜索一下相关内容

搜索一下相关内容

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有