欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在Winform中菜单动态添加“最近使用文件”

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

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

1 新建windform项目

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

在Winform中菜单动态添加“最近使用文件”

 

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

在Winform中菜单动态添加“最近使用文件”

在Winform中菜单动态添加“最近使用文件”

 

 3 代码处理过程

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

using system;
using system.collections.generic;
using system.collections.specialized;
using system.io;
using system.linq;
using system.text;
using system.windows.forms;

/******************************************************************* 
* copyright (c)  版权所有
* 文件名称:filehandler
* 命名空间:testrecentmenu
* 创建时间:2018/12/18 10:27:52
* 作    者: wangyonglai
* 描    述:
* 修改记录:
* 修改人:
* 版 本 号:v1.0.0
**********************************************************************/
namespace testrecentmenu
{
    public class filehandler
    {
        /// <summary>
        /// 最近文件菜单项
        /// </summary>
        public toolstripmenuitem recentfilemenu { get; set; }

        private stringcollection filelist;

        private int filenumbers;

        public filehandler()
        {
            filenumbers = properties.settings.default.filenember;
            filelist = properties.settings.default.filepaths;
            if (filelist == null)
            {
                filelist = new stringcollection();
            }
            
        }


        /// <summary>
        /// 更新最近菜单单项
        /// </summary>
        public void updatemenu()
        {
            if (recentfilemenu == null) return;
            int i;
            //清除当前菜单项
            for (i = recentfilemenu.dropdownitems.count - 1; i >= 0; i--)
            {
                recentfilemenu.dropdownitems.removeat(i);
            }

            for (i = 0; i < filelist.count; i++)
            {
                toolstripitem menuitem = new toolstripmenuitem();
                menuitem.text = path.getfilename(filelist[i]);
                menuitem.tag = filelist[i];
                menuitem.click += menuitem_click;

                recentfilemenu.dropdownitems.add(menuitem);
            }
        }

        void menuitem_click(object sender, eventargs e)
        {
            //点击最近打开菜单项要执行的动作。
        }


        /// <summary>
        /// 添加最近文件路径(每次打开文件时,调用该方法)
        /// </summary>
        /// <param name="filepath"></param>
        public void addrecentfile(string filepath)
        {
            filelist.insert(0, filepath);

            //从最后位置开始倒着找,如果找到一致名称,则移除旧记录
            for (int i = filelist.count - 1; i > 0; i--)
            {
                for (int j = 0; j < i; j++)
                {
                    if (filelist[i] == filelist[j])
                    {
                        filelist.removeat(i);
                        break;
                    }
                }
            }

            //最后,仅保留指定的文件列表数量
            for (int bynd = filelist.count - 1; bynd > filenumbers - 1; bynd--)
            {
                filelist.removeat(bynd);
            }

            properties.settings.default.filepaths = filelist;
            properties.settings.default.save();

            updatemenu();
        }

    }
}

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

filehandler filehandler;
        private void form1_load(object sender, eventargs e)
        {
            filehandler = new filehandler();
            filehandler.recentfilemenu = this.最近文件toolstripmenuitem;//指定 最近文件 的菜单值,方便动态创建文件菜单
            filehandler.updatemenu();
        }

        private void 打开toolstripmenuitem_click(object sender, eventargs e)
        {
            openfiledialog fls = new openfiledialog();
            if (fls.showdialog() == system.windows.forms.dialogresult.ok)
            {
                filehandler.addrecentfile(fls.filename);
            }
        }

  效果图如下

在Winform中菜单动态添加“最近使用文件”