.NET

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

更新日:

スポンサードリンク

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で一度原点に戻ってしまうようです。

スポンサードリンク

-.NET

Copyright© めめんと , 2019 All Rights Reserved Powered by AFFINGER5.