天啊,太悲慘了!在瀏覽器上都寫了好長一段,因為上傳一張圖片伺服器沒有反應,導致前面的工作毀於一旦。以前就感覺在瀏覽器上面寫東西很危險,今天有幸領教了,再不敢了!
言歸正傳:先看一下程式介面吧:
來源程式: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,這裡我只列出我所用到的方法:
聲明: Code:
- RegistryKey key = Registry.CurrentUser.CreateSubKey("Software//Microsoft//VisualStudio");
方法:
Code:
- 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中添加資料可以通過幾種方法實現: Code:
- 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版本的對應關係應該是這樣的:
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) |
我就是按照這樣的關係編的程式。如果誰發現上面的對應關係搞錯了,請提醒我一下。
好了,解決這三個問題之後其餘的就沒有什麼難度了。