特定の列を右クリックするDataGridView
と開くコンテキスト メニューがあります。コンテキスト メニューに表示される内容は、クリックしたフィールドの内容 (複数のファイルへのパス) に依存します (パスは、正しいファイルへの完全な UNC パスを作成するために操作されます)。
唯一の問題は、クリックが機能しないことです。ツールバーからコンテキスト メニューをドラッグ アンド ドロップするのではなく、プログラムで作成しました。
パスを取得できれば(それを と呼びましょうContextMenuChosen
)に表示されるようMessageBox.Show(ContextMenuChosen);
に設定できると考えましたSystem.Diagnostics.Process.Start(ContextMenuChosen);
以下の Mydgv_MouseUp イベントは、実際にMessageBox.Show("foo!");
は、コンテキスト メニューで何かが選択されたときに起動できるところまで機能しますが、そこで終了します。パスの1つがクリックされたときに試したことを示すコメントを以下に残しました。空の文字列になるものもあれば、エラーになるものもあります (オブジェクトがインスタンスに設定されていません...)。
昨日一日中コードを検索しましたが、動的に構築されたコンテキスト メニューの clickEvent を接続する別の方法が見つかりませんでした。
コードとコメント:
ContextMenu m = new ContextMenu();
// SHOW THE RIGHT CLICK MENU
private void Mydgv_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int currentMouseOverCol = Mydgv.HitTest(e.X, e.Y).ColumnIndex;
int currentMouseOverRow = Mydgv.HitTest(e.X, e.Y).RowIndex;
if (currentMouseOverRow >= 0 && currentMouseOverCol == 6)
{
string[] paths = myPaths.Split(';');
foreach (string path in paths)
{
string UNCPath = "\\\\1.1.1.1\\c$\\MyPath\\";
string FilePath = path.Replace("c:\\MyPath\\", @"");
m.MenuItems.Add(new MenuItem(UNCPath + FilePath));
}
}
m.Show(Mydgv, new Point(e.X, e.Y));
}
}
// SELECTING SOMETHING IN THE RIGHT CLICK MENU
private void Mydgv_MouseUp(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo hitTestInfo;
if (e.Button == MouseButtons.Right)
{
hitTestInfo = Mydgv.HitTest(e.X, e.Y);
// If column is first column
if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 6)
{
//MessageBox.Show(m.ToString());
////MessageBox.Show(m.Tag.ToString());
//MessageBox.Show(m.Name.ToString());
//MessageBox.Show(m.MenuItems.ToString());
////MessageBox.Show(m.MdiListItem.ToString());
// MessageBox.Show(m.Name);
//if (m.MenuItems.Count > 0)
//MessageBox.Show(m.MdiListItem.Text);
//MessageBox.Show(m.ToString());
//MessageBox.Show(m.MenuItems.ToString());
//Mydgv.ContextMenu.Show(m.Name.ToString());
//MessageBox.Show(ContextMenu.ToString());
//MessageBox.Show(ContextMenu.MenuItems.ToString());
//MenuItem.text
//MessageBox.Show(this.ContextMenu.MenuItems.ToString());
}
m.MenuItems.Clear();
}
}
私はこれを完了するのに非常に近いので、どんな助けも大歓迎です。