天啊,太悲惨了!在浏览器上都写了好长一段,因为上传一张图片服务器没有反应,导致前面的工作毁于一旦。以前就感觉在浏览器上面写东西很危险,今天有幸领教了,再不敢了!
言归正传:先看一下程序界面吧:
源程序下载地址:http://download.csdn.net/source/1957681
用过Visual Studio .NET版本以后IDE开发工具的人肯定都知道Visual Studio里面那个“起始页”以及“起始页”里面的那个“最近的项目”。
不错!“最近的项目”里面保存着我们最近创建和打开的项目文件,为我们快速打开项目提供了一个很好的方式,避免左拐右撞在文件系统中找寻项目的路径。
可是,总感觉这个“最近的项目”有些地方做得不是很完善。比如说:
1、有的时候为了寻求一点帮助打开了别人的项目或是自己以前的项目,这样的不常用项目也会保存在“最近的项目”列表中,占据有限的资源。(“最近的项目”那个栏空间就那么一点,显示不了几个的。而且似乎也没办法扩展,反正我没找到方法)。
2、有的时候一个项目做完了,这个项目还是天天摆在那里,好像是在炫耀自己一样。殊不知,同样是浪费资源。
3、Visual Studio中没有提供(或我没找到)删除“最近的项目”中项目的方法。
基于以上考虑,我就想自己管理那个“最近的项目”列表。
首先、我翻遍计算机,寻找“最近的项目”的藏身之处。可最后,还是Google告诉了我:这个项目列表藏在注册表HKEY_CURRENT_USER/Software/Microsoft/VisualStudio/9.0/ProjectMRUList子键中(以Visual Studio 2008为例)。
名称为“File<序号>”形式,键值为项目文件的完整路径。
这样我就可以通过增减这个注册表来控制“最近的项目”列表了。
做了几次,又发现这种方法太费劲了,每次都要从上到下找到注册表,再删除一些。麻烦!!!
于是就想编一个小程序来控制这个注册表的修改与增补。
用C#编写控制注册表的程序并不难,只要“using Microsoft.Win32;”再利用Registry和RegistryKey这两个类就好了;读取注册表后将列表显示在dataGridView中,通过对dataGridView的行(Rows)进行移动、添加和删除操作并将操作后的列表保存到注册表中来达到改变“最近的项目”列表的目的。
程序的重点有以下几处:
1、读取注册表。
RegistryKey类的详细信息参见http://msdn.microsoft.com/zh-cn/library/microsoft.win32.registrykey.aspx,
这里我只列出我所用到的方法:
声明:
- RegistryKey key = Registry.CurrentUser.CreateSubKey("Software//Microsoft//VisualStudio");
方法:
- key.GetSubKeyNames();//获取key下的所有子键名称,该方法返回一个字符串数组(string[])。
- key.GetValueNames();//获取key下的所有项的名称,该方法同样返回一个字符串数组(string[])。就是用这个方法读取项目列表的。
- key.SetValue("file"+(i+1).ToString(), dataGridView1[1, i].Value.ToString(), RegistryValueKind.ExpandString);//设置(创建)项。这个方法参数很多,而且有几种重载格式,我所用到的重载格式个参数的含义依次为:项名称、数据、注册表类型。
- key.DeleteValue(keyNames[i], false);//删除项。参数分别为:项名称、指示在找不到指定值的情况下是否引发异常。
- key.Close();//使用完了,自然要把打开的注册表关上了。
2、修改dataGridView的行(Rows)。
这里面涉及到将数据添加到dataGridView和对某一行执行置顶、置底、上移、下移、删除操作,还要能够执行添加新行的操作。
向dataGridView中添加数据可以通过几种方法实现:
- dataGridView1.Rows[n].SetValues(item);//这里n是行的序数,item是object[]型变量。具体操作可以参见我上传的完整项目文件。
- dataGridView1[Column, Row].Value = "字符串";
- dataGridView1.Rows[Row].Cells[Column].Value = "字符串";
以上后两种方法应该算是等价的,即对单独的单元格进行设置。其中Row是行序号,Column是列序号。
对行进行操作。
操作是在修改行
的基础上进行的,无非就是再声明一个缓存变量,将几个相关行的内容反过来倒回去。这里就不讲这个过程了,感兴趣的可以看一下源程序。
在对dataGridView的行进行操作时,有一点需要注意,那就是dataGridView的RowCount属性。在操作(主要是增加)过程中,必须始终操作RowCount以内的行,否则会抛出异常。
为了使dataGridView的RowCount始终与项目个数相等,在删除项目时还要记得执行RowCount--;的操作。这里有个现象很奇怪:当选中最后一行执行删除操作时,在RowCount--;之后,总是删除倒数第二行的数据,而把最后一行补上来。调试很多次一直没找到原因。也许dataGridView就是这样设计的吧。不管了,我也用了一个似乎不太合乎常规的方法将这个问题解决了,那就是执行删除最后一行时,在RowCount--;之前将最后一行的值也赋成倒数第二行的值。最后两个都是倒数第二行的值,不管你删哪个,最后得到的结果都一样。问题就解决了。
3、根据注册表判断电脑上有哪几个版本的Visual Studio。
这里主要通过注册表(HKEY_CURRENT_USER/Software/Microsoft/VisualStudio/9.0/ProjectMRUList)中记录的版本号(9.0)来确定。在网上搜了一下,版本号与Visual Studio版本的对应关系应该是这样的:
版本号 | 版本 |
10.0 | Microsoft Visual Studio 2010 |
9.0 | Microsoft Visual Studio 2008 |
8.0 | Microsoft Visual Studio 2005 |
7.1 | Microsoft Visual Studio .NET 2003 |
7.0 | Microsoft Visual Studio .NET (2002) |
我就是按照这样的关系编的程序。如果谁发现上面的对应关系搞错了,请提醒我一下。
好了,解决这三个问题之后其余的就没有什么难度了。