【C#】【Form】ContextMenuStrip ~右クリックを使うには~

■ ContextMenuStrip

 * 右クリック時に、表示させるメニューを指定することができる
 (これは、使える!!!)

■ 主なプロパティ

Image

 * 表示したいイメージを設定できる

ShortcutKeys

 * メニュー項目にショートカットキーを表示させる

■ 設定方法

【1】 フォームにContextMenuStripを配置
【2】 手順【1】で追加したContextMenuStripをお好みでレイアウトする
 例:
  コピー
  ペースト
  切り取り

【3】 お好みの選択メニューに対して、clickボタンイベントをお好みでそれぞれに実装する
【4】 右クリックを使いたいコントロール(例「panel」「dataGridView」など)のプロパティの
   ContextMenuStripプロパティに、手順1)で追加したContextMenuStripを選択します

... おしまい(超簡単)

参考資料

http://www.labasp.net/CsharpNote/mControl/ContextMenuStrip/101_110.html#101
http://tech.bbtune.com/csharp/items/5-12.html

■ サンプル

例1:右クリックしたコントロールのオブジェクトを取得

 * Openingイベントの第一引数「object sender」をContextMenuStripでキャストし、
  SourceControlで取得できる。
 * これで汎用的に使える
コード
Control selectedControl;

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
   // 右クリックしたコントロールを保持しておく
   var menu = (ContextMenuStrip)sender;
   this.selectedControl = menu.SourceControl;
}
参考資料
http://dobon.net/vb/dotnet/control/cmsourcecontrol.html
http://dobon.net/vb/bbs/log3-10/5552.html

例2:コピー/ペースト/切り取り/全選択/元に戻す/閉じる

 * 2つのTextBoxにそれぞれContextMenuStripを設定している。
コード
public partial class Form1 : Form
{
    Control selectedControl;

    public Form1()
    {
        InitializeComponent();
        this.selectedControl = null;
    }

    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
        // 右クリックしたコントロールを保持しておく
        var menu = (ContextMenuStrip)sender;
        this.selectedControl = menu.SourceControl;
    }

    private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var text = Clipboard.GetText();
        if (!string.IsNullOrEmpty(text))
        {
            var selectedTextBox =
                this.GetSelectedControl<TextBox>(this.selectedControl);
            if (selectedTextBox != null && selectedTextBox.SelectionLength > 0)
            {
                selectedTextBox.SelectionStart =
                    selectedTextBox.SelectionStart +
                    selectedTextBox.SelectionLength;
            }
            selectedTextBox.Paste();
        }
    }

    private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var selectedTextBox =
            this.GetSelectedControl<TextBox>(this.selectedControl);
        if (selectedTextBox != null && selectedTextBox.SelectionLength > 0)
        {
            selectedTextBox.Copy();
        }
    }

    private void allSelectToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var selectedTextBox = 
            this.GetSelectedControl<TextBox>(this.selectedControl);
        if (selectedTextBox != null)
        {
            selectedTextBox.SelectAll();
        }
    }

    private void cutToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var selectedTextBox =
            this.GetSelectedControl<TextBox>(this.selectedControl);
        if (selectedTextBox != null && selectedTextBox.SelectionLength > 0)
        {
            selectedTextBox.Cut();
        }
    }

    private void undoToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var selectedTextBox =
            this.GetSelectedControl<TextBox>(this.selectedControl);
        if (selectedTextBox != null && selectedTextBox.CanUndo)
        {
            selectedTextBox.Undo();
            selectedTextBox.ClearUndo();
        }
    }

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Close();
    }
    
    private T GetSelectedControl<T>(object selectedControl)
        where T : class
    {
        T returnValue = null;
        if (selectedControl != null && selectedControl is T)
        {
            returnValue = (T)selectedControl;
        }

        return returnValue;
    }
}


関連記事

Windows Form ~ 目次 ~

https://blogs.yahoo.co.jp/dk521123/8054245.html

NotifyIcon ~ ポップアップ通知を行うには... ~

https://blogs.yahoo.co.jp/dk521123/37855712.html

DataGridView に右クリックを適用する

https://blogs.yahoo.co.jp/dk521123/30488275.html