【C#】データグリッドビュー上で右クリックしたときに位置に応じてコンテキストメニューの中身を変更したい

公開日: : 最終更新日:2014/08/14 .NET

スポンサーリンク

DataGridView上でクリックした位置によってコンテキストメニューの内容を変えたいと思ったのですが、あまりうまくいきませんでした。

色々試した結果、データグリッドビュー側のCellMouseClickなどのクリックイベントはコンテキストメニューのイベントがある状態だと右クリックしても呼ばれないことがわかりました。つまりコンテキストメニューの表示しか呼ばれないということです。

そこで、コンテキストメニューを関連付けずにCellMouseClickから表示を行うことにしました。

private void dataGridView1_CellMouseClick
(object sender, DataGridViewCellMouseEventArgs e)
{
	//右クリックのときのみ
	if (e.Button == MouseButtons.Right)
	{
		int idx = dataGridView1.CurrentCell.RowIndex;
		int rowindex= e.RowIndex;
		//クリック位置に応じた文字を取得して変更する
		string tmp =
			(string)this.dataGridView1.Rows[rowindex].Cells[0].Value;
		this.contextMenuStrip1.Items[1].Text = tmp;
		//コンテキストメニューを表示する
		this.contextMenuStrip1.Show();
		//マウスカーソルの位置を画面座標で取得
		Point p = Control.MousePosition;
		this.contextMenuStrip1.Top = p.Y;
		this.contextMenuStrip1.Left = p.X;
	}
}

このCellMouseClickイベントではどの行にカーソルがあるのかを取得して、その内容によって中身を変えています。そして、コンテキストメニューのItemsメンバで表示テキストを変更しています。

後は表示するだけなので、Showメソッドを呼べばいいのですが、ただ呼ぶだけでは表示される位置が画面の左上になってしまいとてもおかしくなってしまいます。

そこで、TopとLeftをクリック位置で移動させればいいです。ちなみに、Showの前で移動させてもShowで一度原点に戻ってしまうようです。

スポンサーリンク
Amazon

  • このエントリーをはてなブックマークに追加

関連記事

リクルート期間限定ポイントの有効な使い道

はじめに  先日クレジットカードの見直し活動の一環でポイント還元率の

初心者がお金を貯めるための節約・財テク手法まとめ【ポイント還元・投資・税金対策】

はじめに  最近なるべく節約しようと思い、お金周りに関して色々調べて

動画講座を効率的にキャプチャして復習する方法

はじめに  最近、動画媒体の講座などをたまに視聴しています。独学だと

Twitterのオリジナルサイズの画像ファイル(.jpg-large,.jpg-orig等)を一括リネームする

Twitterの画像をオリジナルサイズで保存しようとするとjpg-la

【Unity】他のスクリプトを一括で取得して有効化・無効化を制御する

Unityを使っていて他のスクリプトを一時的に停止させたいと思ったので

テレビの録画をPCやNASで共有する

今までテレビはテレビ用のモニターで見ればいいやと思っていたのですが、さ

【DeepLearning】物体検出手法のSSD(Keras版)を試す (Ubuntu14.04)

はやりのディープラーニングの物体検出手法の一つであるSSDのサンプルを

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑