■ 設定方法
【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