■ 設定方法
【1】 フォームにContextMenuStripを配置 【2】 手順【1】で追加したContextMenuStripをお好みでレイアウトする 例: コピー ペースト 切り取り 【3】 お好みの選択メニューに対して、clickボタンイベントをお好みでそれぞれに実装する 【4】 右クリックを使いたいコントロール(例「panel」「dataGridView」など)のプロパティの ContextMenuStripプロパティに、手順1)で追加したContextMenuStripを選択します ... おしまい(超簡単)
参考資料
http://www.labasp.net/CsharpNote/mControl/ContextMenuStrip/101_110.html#101http://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; } }
参考資料
http://uchukamen.com/Programming1/Menu/index.htm#SEC11http://dobon.net/vb/dotnet/control/cmsourcecontrol.html
http://dobon.net/vb/dotnet/datagridview/clipboardcopy.html
http://dobon.net/vb/dotnet/control/tbtextedit.html