У меня есть DataGridView
и контекстное меню, которое открывается при щелчке правой кнопкой мыши по определенному столбцу. То, что отображается в контекстном меню, зависит от того, что находится в выбранном поле - пути к нескольким файлам (пути управляются для создания полного пути UNC к правильному файлу).Как создать динамически построенное контекстное меню clickEvent
Единственная проблема в том, что я не могу заставить щелчок работать. Я не перетащил контекстное меню с панели инструментов, я создал его программно.
Я понял, что если я могу получить путь (назовем его ContextMenuChosen
), чтобы показать в MessageBox.Show(ContextMenuChosen);
я мог установить то же самое System.Diagnostics.Process.Start(ContextMenuChosen);
Событие Mydgv_MouseUp ниже фактически работает до точки, где я могу получить его fire off MessageBox.Show("foo!");
, когда что-то в контекстном меню выбрано, но оно заканчивается. Я оставил в кучу комментариев ниже, показывая, что я пробовал, когда на него нажимают один из путей. Некоторые результат в пустых строках, другие ошибки (объект не установлен в экземпляр ...).
Я искал код вчера днем, но не смог найти другой способ подключить динамически построенное контекстное меню 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();
}
}
Я очень близок к завершению этого так что любая помощь будет оценена.
LarsTech, он работал совершенно отлично, спасибо так много. – Chris
функция menu_click должна возвращать «EventHandler»? – sparkyShorts
@sparkyShorts Нет, события сопоставляются с методами. В этом случае событие click сопоставляется для запуска метода menu_Click каждый раз, когда в элементе меню создается клик. 'mi.Click + = menu_Click;' коротко для 'mi.Click + = new EventHandler (menu_Click);' – LarsTech