前回はファイルの履歴を表示させました。
ただ、これにはいくつかの問題があります。それは表示件数を変えることができないことです。ファイルを開いたり別名保存を繰り返すたびに履歴はどこまでも増えていきます。
それから新しい履歴ほど上に表示させたいものです。
ではそのようにつくりかえてみましょう。
まずファイル履歴を管理するためのフィールド変数をつくります。
1 2 3 4 |
public partial class Form1 : Form { List<string> fileHistory = new List<string>(); } |
そしてファイルが保存されたり読み出されたらfileHistoryにファイルパスを追加します。このときに新しいものを先頭に追加して、上限を超えていれば一番古いもの(一番後ろにあるもの)を削除してしまえばいいですね。
そして[ファイル]がクリックされたらサブメニューがドロップダウンされるのですが、そのときにfileHistory内にあるファイルパスのリストを表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { void LoadFileHistory() { if (!File.Exists(Application.StartupPath + "\\FileHistory.comfig")) return; string historyPath = Application.StartupPath + "\\FileHistory.comfig"; XmlSerializer xml = new XmlSerializer(typeof(List<string>)); StreamReader sr = new StreamReader(historyPath); fileHistory = (List<string>)xml.Deserialize(sr); sr.Close(); fileHistory = fileHistory.Distinct().ToList(); } } |
メニューにファイル履歴を追加するときに呼び出されるAddFileHistoryメソッドは以下のように変更します。
リストの最初に追加します。またここで重複登録や存在しないファイルの登録のチェックもおこないます。それからTakeをつかって最大件数を超えたものはリストから排除されるようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { int MAX_fileHistory = 10; void AddFileHistory(string filePath) { fileHistory.Insert(0, filePath); fileHistory = fileHistory.Distinct().ToList(); // ダブりはリストから排除 fileHistory = fileHistory.Where(x => File.Exists(x)).ToList(); // 存在しないファイルはリストから排除 fileHistory = fileHistory.Take(MAX_fileHistory).ToList(); SaveFileHistory(); } } |
[ファイル]のサブメニューがドロップダウンされるときにファイル履歴を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public partial class Form1 : Form { void InsertFileHistory() { foreach (string path in fileHistory) { if (!File.Exists(path)) // 存在しないファイルは表示しない continue; if (curFilePath == path) // 編集中のファイルと同じであるなら表示しない continue; ToolStripMenuItem newItem = new ToolStripMenuItem(); newItem.Click += Item_Click; newItem.Text = path; newItem.Tag = path; newItem.Name = "FileHistory_xyz"; // ファイル履歴であることがわかるようにする fileToolStripMenuItem.DropDownItems.Add(newItem); } } private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) { // ファイル履歴はいったん削除 var items = fileToolStripMenuItem.DropDownItems.Find("FileHistory_xyz", false); foreach (var item in items) fileToolStripMenuItem.DropDownItems.Remove(item); InsertFileHistory(); } } |
SaveFileHistory と Item_Click は前回と同じです。