タイトルそのままです。クリック一発で登録しておいたフォルダを一気に開くアプリケーションを作成します。
まずデザイナで以下のようなものをつくります。
テキストボックスのように見えるのは
で作成したTextBoxForFilePathです。以下のコードでファイルやフォルダをドラッグ&ドロップするとパスが入力され、[開く]をクリックすると登録しておきたファイルやフォルダを一気に開くことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.IO; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileFolder(textBoxForFilePath1.Text); OpenFileFolder(textBoxForFilePath2.Text); OpenFileFolder(textBoxForFilePath3.Text); OpenFileFolder(textBoxForFilePath4.Text); OpenFileFolder(textBoxForFilePath5.Text); } void OpenFileFolder(string path) { if(Directory.Exists(path) || File.Exists(path)) System.Diagnostics.Process.Start(path); } } |
このアプリケーションは普段はタスクトレイのなかに表示させ、必要なときにいつでも実行できるようにしてしまいましょう。
アイコンはこれを使います。
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 32 33 34 35 36 37 38 39 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); NotifyIcon.Visible = true; NotifyIcon.MouseDown += NotifyIcon_MouseDown; NotifyIcon.Icon = Properties.Resources.icon; MenuItemEnd.Click += MenuItemEnd_Click; } NotifyIcon NotifyIcon = new NotifyIcon(); private void NotifyIcon_MouseDown(object sender, MouseEventArgs e) { this.Visible = true; } bool isEnd = false; protected override void OnClosing(CancelEventArgs e) { if(!isEnd) { this.Visible = false; e.Cancel = true; } base.OnClosing(e); } private void MenuItemEnd_Click(object sender, EventArgs e) { isEnd = true; NotifyIcon.Dispose(); Application.Exit(); } } |
それから一気に開きたいフォルダの組み合わせはひとつではないはずなので、複数の組み合わせを登録できるようにします。それから設定を保存できるようにしたいですね。
まずデータを管理するためのクラスを作成します。
1 2 3 4 5 |
public class Data { public List<string> FilePaths = new List<string>(); public string ItemName = ""; } |
1 2 3 4 |
public partial class Form1 : Form { List<Data> Datas = new List<Data>(); } |
最初は項目が選択されていないので、テキストボックスにはなにも入力できないようにしておきます。
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 |
public partial class Form1 : Form { private void Form1_Load(object sender, EventArgs e) { EnableTextBoxes(false); ClearTextBoxes(); } void EnableTextBoxes(bool enable) { textBoxForFilePath1.Enabled = enable; textBoxForFilePath2.Enabled = enable; textBoxForFilePath3.Enabled = enable; textBoxForFilePath4.Enabled = enable; textBoxForFilePath5.Enabled = enable; } void ClearTextBoxes() { textBoxForFilePath1.Text = ""; textBoxForFilePath2.Text = ""; textBoxForFilePath3.Text = ""; textBoxForFilePath4.Text = ""; textBoxForFilePath5.Text = ""; } } |
[項目の管理] ⇒ [追加]が選択されたらアイテムを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { private void MenuItemAdd_Click(object sender, EventArgs e) { Data data = new Data(); data.ItemName = "新しいアイテム"; if(listBox1.SelectedIndex == -1) { Datas.Insert(0, data); listBox1.Items.Insert(0, data.ItemName); listBox1.SelectedIndex = 0; } else { Datas.Insert(listBox1.SelectedIndex+1, data); listBox1.Items.Insert(listBox1.SelectedIndex+1, data.ItemName); } } } |
そして現在選択されているアイテムが変更されたらそれに対応するデータを表示します。SaveOldData()メソッドは現在選択されているアイテムに対応するデータを保存するためのメソッドです。フィールド変数 SelectedIndexにはこれまで選択されていたアイテムのインデックスを格納されているので、これを利用して古いデータを保存します。
SavePaths(List<string> paths)LoadPaths(List<string> paths)はDataオブジェクトにファイルパスを格納したり、そこから文字列を読み出すためのメソッドです。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
public partial class Form1 : Form { int SelectedIndex = -1; private void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { SaveOldData(); SelectedIndex = listBox1.SelectedIndex; if(SelectedIndex != -1) { EnableTextBoxes(true); List<string> paths = Datas[SelectedIndex].FilePaths; LoadPaths(paths); } else { EnableTextBoxes(false); ClearTextBoxes(); } } void SaveOldData() { if(SelectedIndex != -1) { List<string> paths = Datas[SelectedIndex].FilePaths; SavePaths(paths); } } void SavePaths(List<string> paths) { paths.Clear(); paths.Add(textBoxForFilePath1.Text); paths.Add(textBoxForFilePath2.Text); paths.Add(textBoxForFilePath3.Text); paths.Add(textBoxForFilePath4.Text); paths.Add(textBoxForFilePath5.Text); } void LoadPaths(List<string> paths) { if(paths.Count >= 5) textBoxForFilePath5.Text = paths[4]; else textBoxForFilePath5.Text = ""; if(paths.Count >= 4) textBoxForFilePath4.Text = paths[3]; else textBoxForFilePath4.Text = ""; if(paths.Count >= 3) textBoxForFilePath3.Text = paths[2]; else textBoxForFilePath3.Text = ""; if(paths.Count >= 2) textBoxForFilePath2.Text = paths[1]; else textBoxForFilePath2.Text = ""; if(paths.Count >= 1) textBoxForFilePath1.Text = paths[0]; else textBoxForFilePath1.Text = ""; } } |
[項目の管理] ⇒ [名前変更]が選択されたらアイテムの名前を変更します。名前変更のためのダイアログを表示させ、OKがクリックされた場合で文字列が取得できた場合だけアイテムの名前を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void MenuItemChangeName_Click(object sender, EventArgs e) { if(listBox1.SelectedIndex != -1) { SaveOldData(); EnableTextBoxes(true); string itemName = Datas[listBox1.SelectedIndex].ItemName; Form2 form2 = new Form2(itemName); if(form2.ShowDialog() == DialogResult.OK) { if(form2.ItemName != "") { Datas[listBox1.SelectedIndex].ItemName = form2.ItemName; listBox1.Items[listBox1.SelectedIndex] = form2.ItemName; } } } } } |
名前変更のためのダイアログは以下のようになっています。
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 Form2 : Form { public Form2() { InitializeComponent(); buttonOK.DialogResult = DialogResult.OK; buttonOK.Click += ButtonOK_Click; } public Form2(string str) { InitializeComponent(); ItemName = str; buttonOK.DialogResult = DialogResult.OK; buttonOK.Click += ButtonOK_Click; } public string ItemName = ""; private void Form2_Load(object sender, EventArgs e) { textBox1.Text = ItemName; } private void ButtonOK_Click(object sender, EventArgs e) { ItemName = textBox1.Text; } } |
[項目の管理] ⇒ [削除]がクリックされたら現在選択されているアイテムを削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { private void MenuItemRemove_Click(object sender, EventArgs e) { if(listBox1.SelectedIndex != -1) { int index = listBox1.SelectedIndex; listBox1.SelectedIndex = -1; Datas.RemoveAt(index); listBox1.Items.RemoveAt(index); if(Datas.Count > index) listBox1.SelectedIndex = index; else listBox1.SelectedIndex = index-1; } } } |
[項目の管理] ⇒ [上へ移動]、[下へ移動]がクリックされたら現在選択されているアイテムを上下に移動させます。
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 32 33 34 35 36 37 38 39 40 |
public partial class Form1 : Form { private void MenuItemMoveUp_Click(object sender, EventArgs e) { if(listBox1.SelectedIndex != -1 && listBox1.SelectedIndex != 0) { SaveOldData(); int index = listBox1.SelectedIndex; listBox1.SelectedIndex = -1; Data data = Datas[index]; Datas.RemoveAt(index); Datas.Insert(index-1, data); listBox1.Items.RemoveAt(index); listBox1.Items.Insert(index-1, data.ItemName); listBox1.SelectedIndex = index-1; } } private void MenuItemMoveDown_Click(object sender, EventArgs e) { if(listBox1.SelectedIndex != -1 && listBox1.SelectedIndex != Datas.Count-1) { SaveOldData(); int index = listBox1.SelectedIndex; listBox1.SelectedIndex = -1; Data data = Datas[index]; Datas.RemoveAt(index); Datas.Insert(index + 1, data); listBox1.Items.RemoveAt(index); listBox1.Items.Insert(index + 1, data.ItemName); listBox1.SelectedIndex = index + 1; } } } |
[ファイル] ⇒ [保存]が選択されたらデータをファイルに保存し、[ファイル] ⇒ [読み出し]が選択されたら読み出します。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System.IO; using System.Xml.Serialization; public partial class Form1 : Form { private void MenuItemSaveFile_Click(object sender, EventArgs e) { SaveOldData(); SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "データファイル(*.xml)|*.xml"; dialog.DefaultExt = "xml"; if(dialog.ShowDialog() == DialogResult.OK) { XmlSerializer xml = new XmlSerializer(typeof(List<Data>)); StreamWriter sw = new StreamWriter(dialog.FileName); xml.Serialize(sw, Datas); sw.Close(); } dialog.Dispose(); } private void MenuItemLoadFile_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "データファイル(*.xml)|*.xml"; dialog.DefaultExt = "xml"; if(dialog.ShowDialog() == DialogResult.OK) { XmlSerializer xml = new XmlSerializer(typeof(List<Data>)); StreamReader sr = new StreamReader(dialog.FileName); Datas = (List<Data>)xml.Deserialize(sr); sr.Close(); listBox1.Items.Clear(); foreach(Data data in Datas) { listBox1.Items.Add(data.ItemName); } if(Datas.Count > 0) listBox1.SelectedIndex = 0; } dialog.Dispose(); } } |