標籤:des winform style blog color 使用 os io
這篇是針對上一篇講序列化的文章的一個實際案例,WinForm程式的主介面如下:
思路:在點擊儲存按鈕時,將標題和內容儲存到集合中,自然想到應該是Dictionary<K,V>,而且用這個集合可以避免產生2個相同標題的日記。對添加到集合中的資料,採用二進位序列化到檔案中,在程式執行目錄中專門建一個“Notes”的檔案夾存放日記檔案,日記檔案的檔案名稱以標題命名。程式載入的時候,如果“Notes”檔案夾下有檔案,就在右側列表中負載檔案,點擊時還原序列化後顯示在左側。下面是具體代碼:
在Form1類下定義一個集合:
1 Dictionary<string, string> dic = new Dictionary<string, string>();
“儲存”按鈕的點擊作業碼如下:
1 var sTitle = txtTitle.Text.Trim(); 2 var sContent = txtContent.Text.Trim(); 3 4 dic.Add(sTitle, sContent); 5 6 string fullPath = Path.Combine("Notes", sTitle + ".txt"); 7 using (FileStream fsWrite=new FileStream(fullPath,FileMode.Create,FileAccess.Write)) 8 { 9 //進行二進位序列化10 BinaryFormatter bf = new BinaryFormatter();11 bf.Serialize(fsWrite, dic);12 MessageBox.Show("添加日記成功");13 }
在Form1_Load中的事件處理代碼如下:
1 string sPath1 = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 2 string sPath2 = "Notes"; 3 string fullPath1 = Path.Combine(sPath1, sPath2); 4 string[] strFiles = Directory.GetFiles(fullPath1, "*.txt"); 5 6 if (strFiles.Length>0) 7 { 8 foreach (string item in strFiles) 9 {10 var s = Path.GetFileName(item);11 listBox1.Items.Add(s);12 } 13 }
在listBox1_SelectedValueChanged中的事件處理代碼如下:
1 if (listBox1.SelectedItem!=null) 2 { 3 var FileName = listBox1.SelectedItem.ToString(); 4 var fullPath2 = Path.Combine("Notes", FileName); 5 using (FileStream fsRead=new FileStream(fullPath2,FileMode.Open,FileAccess.Read)) 6 { 7 BinaryFormatter bf1 = new BinaryFormatter(); 8 //進行二進位還原序列化 9 Dictionary<string, string> dic2 = bf1.Deserialize(fsRead) as Dictionary<string, string>;10 foreach (KeyValuePair<string,string> item in dic2)11 {12 txtTitle.Text = item.Key;13 txtContent.Text = item.Value;14 }15 }16 }17 else18 {19 MessageBox.Show("請選擇要查看的檔案");20 }
總結:
程式還有些Bug,因為主要的重點是放在序列化的使用上,日後如果有時間再完善功能吧。
1.對於新添加的日記,需要在下一次程式啟動中才會載入到右側listBox中(想法是做到儲存後就載入到listBox);
2.對於日記的修改,修改內容後,點擊儲存,可適時看到修改的變化;而如果把標題和內容都修改了,程式則認為是一個全新的日記(Dictionary集合會因為key的不同,而重新添加)。