Private Menu

Contex Menu にプライベートメニューを追加します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Private Menu

  1. File Handler を自作するメリットは、何と言っても自分の思い通りにカスタマイズ出来ることです。
    今回は Contex Menu にプライベートメニューを追加してみましょう。
    当初から設定されている分も含めた Contex Menu の説明です。
    IDメソッド説明
    Clipbord(&C) ItemSave 複数個の選択中のアイテムをクリップボードに保存
    サブフォルダ(&S) SubFolder 一個の選択中のフォルダを ListView に表示
    別名で貼り付け(&P)Paste 複数個の選択中のアイテムを別名で貼り付け
    エディタで編集(&E)Editor 複数個の選択中のファイルをエディタで起動
    選択→ゴミ箱(&D) Dust 複数個の選択中のアイテムをゴミ箱に移動
    ReadonlyOnOff(&R) ReadOnOff 一個の選択中のアイテムの ReadOnly を On⇔Off
    Clipbord(&C) は最初に Contex Menu を設定したときに実装されています。
    欲張るとキリが無いので、これぐらいにしておきましょう。
    Contex Menu の基本は 右クリックメニュー を参照して下さい。
  2. ContexMenu から呼ばれる SubFolder() メソッドです。
    選択中のフォルダ名を取得して List View に表示します。
        private void SubFolder(object sender, EventArgs e)
        {
            ListViewItem itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            Sel_Dir = Sel_Dir + "\\" + itemx.Text;
            SetList(Sel_Dir);
        }
    
  3. ContexMenu から呼ばれる Paste() メソッドです。
    現在選択されているアイテムを Clip_Set() でクリップボードに保存します。
    クリップボードのアイテムを別名(一時的な名前)で貼り付けます。
    ViewReset() で List View を最新の情報に更新します。
        private void Paste(object sender, EventArgs e)
        {
            string  str,strout;
            if (Clip_Set()==false)  MessageBox.Show("アイテムを選択して下さい");
            System.Collections.Specialized.StringCollection files = Clipboard.GetFileDropList();
            foreach(string fileName in files)
            {
                str = fileName;
                strout= Sel_Dir + "\\" + "コピー ~ " + Path.GetFileName(str);
                if (File.Exists(str))   File_Copy(str,strout,true);
            }
            ViewReset();
        }
    
  4. ContexMenu から呼ばれる Editor() メソッドです。
    現在選択されているアイテムを Clip_Set() でクリップボードに保存します。
    クリップボードのファイル名を取得して、エディタから起動します。
    Process を使うときは using を追加して下さい。
    ED_Path には、エディタのパスを設定します。
    私は専用のエディタを使っていますが、メモ帳のときは次のように設定します。
    using System.Diagnostics;   //Process の起動
        public string   ED_Path = @"C:\WINDOWS\System32\notepad.exe";
    
        private void Editor(object sender, EventArgs e)
        {
            string  str;
            if (Clip_Set()==false)  MessageBox.Show("アイテムを選択して下さい");
            System.Collections.Specialized.StringCollection files = Clipboard.GetFileDropList();
            foreach(string fileName in files)
            {
                str = fileName;
                if (File.Exists(str))       //ファイル
                {   Process.Start(ED_Path, str);  }
            }
        }
    
  5. ContexMenu から呼ばれる Dust() メソッドです。
    メニューバーから実行することも出来るのですが、右クリックで起動する方が便利です。
    現在選択されているアイテムをクリップボードに保存して、DustBox() を呼び出します。
        private void Dust(object sender, EventArgs e)
        {
            if (Clip_Set()==false)
            {   MessageBox.Show("アイテムを選択して下さい");
                return;
            }
            DustBox(sender, e);
        }
    
  6. ContexMenu から呼ばれる ReadOnOff() メソッドです。
    選択中のアイテムを取得して ReadOnly フラグを切り替えます。
        private void ReadOnOff(object sender, EventArgs e)
        {
            string  pass;
            ListViewItem itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            pass = Sel_Dir + "\\" + itemx.Text;
            ReadOnly_OnOff(pass);
        }
    
  7. ReadOnOff() から呼ばれる ReadOnly_OnOff() メソッドです。
    ReadOnly フラグを切り替えて、現在の状態を MessageBox に表示します。
        private void ReadOnly_OnOff(string path)
        {
            FileAttributes fas = File.GetAttributes(path);
            if ((fas & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                MessageBox.Show("読み取り専用→書き込み許可", path);
                fas = FileAttributes.Normal;
            }
            else
            {
                MessageBox.Show("書き込み許可→読み取り専用", path);
                fas = fas | FileAttributes.ReadOnly;
            }
            File.SetAttributes(path, fas);
        }
    
  8. プライベートメニューをテストして下さい。
    Contex Menu にプライベートメニューを追加するだけで、随分使いやすくなりました。

ToolBar Menu

  1. Contex Menu に設定した「サブフォルダ」を選択するとサブフォルダが List View に表示されます。
    これに対応するものとして、親フォルダに移るメニューを ToolBar に設定します。
    それと新規フォルダを作成する機能がほしいので、合わせて設定します。
    ToolStrip の設定は ToolStrip(ToolBar)を設定する を参照して下さい。
    また貼り付ける二枚の画像を用意して下さい。
  2. ToolStrip には Handler Menu で、コピーとゴミ箱のメニューが設定されています。
    これに続いて3個目と4個目の Button を設定します。
    Button のプロパティから用意した画像をインポートして下さい。
    プロパティウインドウの[イベントアイコン]から OyaFolder() と NewFolder() のメソッドを作成します。
  3. 親フォルダに移る OyaFolder() メソッドです。
        private void OyaFolder(object sender, EventArgs e)
        {   int i;
            i = Sel_Dir.Length;
            if (i<2)    return;
            Sel_Dir = Sel_Dir.Substring(0, i-1);
            i = Sel_Dir.LastIndexOf('\\');
            if (i<0)    return;
            Sel_Dir = Sel_Dir.Substring(0, i+1);
     Console.WriteLine(Sel_Dir);
            ViewReset();
        }
    
  4. 新規フォルダを作成する NewFolder() メソッドです。
        private void NewFolder(object sender, EventArgs e)
        {
            string  str;
            str = Sel_Dir + "\\" + "New Folder";
    Console.WriteLine(str);
            FileSystem.CreateDirectory(str);
            ViewReset();
        }
    

Rename

  1. プライベートメニューから「別名で貼り付け」ると "コピー ~ " を含んだ名前に設定されます。
    大抵の場合には、すぐに名前を変更するのでしょうが、その機能も実装してみましょう。
    List View のアイテム名の変更は アイテム名の変更 を参照して下さい。
    Handler ではアイテムの名前を変更するだけで無く、フォルダに格納されているファイル名(フォルダ名)も変更しなければなりません。
  2. List View に LabelEdit = true を設定します。
    ラベル編集の開始と終了を知らせる BeforeLabelEdit と AfterLabelEdit を用意します。
            this.listView1.LabelEdit = true;
            this.listView1.BeforeLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.ListView1_BeforeLabelEdit);
            this.listView1.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.ListView1_AfterLabelEdit);
    
  3. ListView1_BeforeLabelEdit() メソッドで変更前の名前を Buf に一時保存します。
        private void ListView1_BeforeLabelEdit(object sender, LabelEditEventArgs e)
        {
            ListViewItem itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            Buf = itemx.Text;
        }
    
  4. ListView1_AfterLabelEdit() メソッドで変更後の名前が重複していないかを調べます。
    重複していなければ、変更前(string Before)と変更後(string After)の名前を編集します。
    フォルダのときは Directory.Move() で、ファイルのときは File.Move() で名前を変更します。
        private void ListView1_AfterLabelEdit(object sender, LabelEditEventArgs e)
        {
            if (e.Label != null)        //ラベルが変更されたとき
            {
                ListView lv = (ListView)sender;
                foreach(ListViewItem lvi in lv.Items)
                {
                    if (lvi.Index != e.Item && lvi.Text == e.Label)
                    {
                        MessageBox.Show("同名のアイテムがすでにあります。");
                        e.CancelEdit = true;    //編集をキャンセルして元に戻す
                        return;
                    }
                }
                string Before = Sel_Dir + "\\" + Buf;
                string After = Sel_Dir + "\\" + e.Label;
    Console.WriteLine(Before + "→" + After);
                if (System.IO.Directory.Exists(Before))     //ディレクトリ名の変更
                {   System.IO.Directory.Move(Before,After);  }
                else                                        //ファイル名の変更
                {   System.IO.File.Move(Before,After); }
            }
        }
    

[Next Chapter ↓] File Handler Version 1.0
[Previous Chapter ↑] 表示メニューを実装

超初心者のプログラム入門(C# Frame Work)