经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
在Winform中菜单动态添加“最近使用文件”
来源:cnblogs  作者:永恒921  时间:2018/12/19 9:14:36  对本文有异议

最近在做文件处理系统中,要把最近打开文件显示出来,方便用户使用。网上资料有说,去遍历“C:\Documents and Settings\Administrator\Recent”下的最近文档本。文主要介绍在Winform界面菜单中实现【最近使用的文件】动态菜单的处理,实现一个较为常用的功能。

1 新建windform项目

在窗体中添加 menuStrip 控件 ,添加 ‘打开’与 ‘最近文件’

 

2 打开settings 文件,如下图添加相关参数

 

 3 代码处理过程

添加一个FileHandler 类,用户处理配置文件中的类容熟悉以及菜单栏中的单项对象。代码如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. /******************************************************************* 
  10. * Copyright (C)  版权所有
  11. * 文件名称:FileHandler
  12. * 命名空间:TestRecentMenu
  13. * 创建时间:2018/12/18 10:27:52
  14. * 作    者: wangyonglai
  15. * 描    述:
  16. * 修改记录:
  17. * 修改人:
  18. * 版 本 号:v1.0.0
  19. **********************************************************************/
  20. namespace TestRecentMenu
  21. {
  22. public class FileHandler
  23. {
  24. /// <summary>
  25. /// 最近文件菜单项
  26. /// </summary>
  27. public ToolStripMenuItem RecentFileMenu { get; set; }
  28.  
  29. private StringCollection fileList;
  30.  
  31. private int fileNumbers;
  32.  
  33. public FileHandler()
  34. {
  35. fileNumbers = Properties.Settings.Default.FileNember;
  36. fileList = Properties.Settings.Default.FilePaths;
  37. if (fileList == null)
  38. {
  39. fileList = new StringCollection();
  40. }
  41. }
  42.  
  43.  
  44. /// <summary>
  45. /// 更新最近菜单单项
  46. /// </summary>
  47. public void UpdateMenu()
  48. {
  49. if (RecentFileMenu == null) return;
  50. int i;
  51. //清除当前菜单项
  52. for (i = RecentFileMenu.DropDownItems.Count - 1; i >= 0; i--)
  53. {
  54. RecentFileMenu.DropDownItems.RemoveAt(i);
  55. }
  56.  
  57. for (i = 0; i < fileList.Count; i++)
  58. {
  59. ToolStripItem menuItem = new ToolStripMenuItem();
  60. menuItem.Text = Path.GetFileName(fileList[i]);
  61. menuItem.Tag = fileList[i];
  62. menuItem.Click += menuItem_Click;
  63.  
  64. RecentFileMenu.DropDownItems.Add(menuItem);
  65. }
  66. }
  67.  
  68. void menuItem_Click(object sender, EventArgs e)
  69. {
  70. //点击最近打开菜单项要执行的动作。
  71. }
  72.  
  73.  
  74. /// <summary>
  75. /// 添加最近文件路径(每次打开文件时,调用该方法)
  76. /// </summary>
  77. /// <param name="filePath"></param>
  78. public void AddRecentFile(string filePath)
  79. {
  80. fileList.Insert(0, filePath);
  81.  
  82. //从最后位置开始倒着找,如果找到一致名称,则移除旧记录
  83. for (int i = fileList.Count - 1; i > 0; i--)
  84. {
  85. for (int j = 0; j < i; j++)
  86. {
  87. if (fileList[i] == fileList[j])
  88. {
  89. fileList.RemoveAt(i);
  90. break;
  91. }
  92. }
  93. }
  94.  
  95. //最后,仅保留指定的文件列表数量
  96. for (int bynd = fileList.Count - 1; bynd > fileNumbers - 1; bynd--)
  97. {
  98. fileList.RemoveAt(bynd);
  99. }
  100.  
  101. Properties.Settings.Default.FilePaths = fileList;
  102. Properties.Settings.Default.Save();
  103.  
  104. UpdateMenu();
  105. }
  106.  
  107. }
  108. }

4 在主界面中调用FileHandler相关函数

  1. FileHandler filehandler;
  2. private void Form1_Load(object sender, EventArgs e)
  3. {
  4. filehandler = new FileHandler();
  5. filehandler.RecentFileMenu = this.最近文件ToolStripMenuItem;//指定 最近文件 的菜单值,方便动态创建文件菜单
  6. filehandler.UpdateMenu();
  7. }
  8.  
  9. private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
  10. {
  11. OpenFileDialog fls = new OpenFileDialog();
  12. if (fls.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  13. {
  14. filehandler.AddRecentFile(fls.FileName);
  15. }
  16. }

  效果图如下

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号