Итак, я просмотрел множество примеров ContextMenu и других постов о назначении событий, и, насколько я могу судить, все настроено правильно. Я могу щелкнуть правой кнопкой мыши и увидеть появившееся меню, которое доказывает, что код создает контекстное меню и назначает ему событие click, но когда я щелкаю всплывающее окно, назначенное событие никогда не срабатывает. Пользователь не должен щелкать по указанному столбцу c, он может щелкнуть любую ячейку в строке или выбрать несколько строк, а затем применить изменения к данным в каждой выбранной строке. Для простоты я тестирую с фиксированным значением, но позже пользователю нужно будет указать количество дней, которое нужно добавить к датам.
Может кто-нибудь сказать мне, где я ошибся, пожалуйста?
Мой код выглядит следующим образом:
private void ProjectDetails_MouseDown(object sender, MouseEventArgs e)
{
// Ignore all but right button mouse clicks
if (e.Button != MouseButtons.Right) return;
// ** Temporary Solution **//
DelayDays = 5;
// Create the context menu on the grid clicked
AssignContextMenu(sender, e);
}
private void AssignContextMenu(object sender, MouseEventArgs e)
{
// Exit if the control is null
if (!(sender is DataGridView dgv)) return;
// Get the row the user clicked
var currentRow = dgv.HitTest(e.X, e.Y).RowIndex;
// Do nothing if header row clicked
if (currentRow < 0) return;
// Count the number of rows selected
var selectedRows = dgv.SelectedCells.Cast<DataGridViewCell>().Select(c => c.RowIndex)
.Distinct().Count();
// Select the row if either one or none selected
ClickedRow = (selectedRows <= 1) ? currentRow : 0;
// Create context menu
using (var delayMenu = new ContextMenu())
{
// Add the menu item
var delayMenuItem = new MenuItem {Text = "Delay Dates"};
// Assign the procedure to the click event
delayMenuItem.Click += DelayGridData_RightClick;
// Add the item to the menu
delayMenu.MenuItems.Add(delayMenuItem);
// Show the menu at the position the user clicked the grid
delayMenu.Show(dgv, new Point(e.X, e.Y));
}
}
private void DelayGridData_RightClick(object sender, EventArgs e)
{
// Loop through the current or selected rows adding 5 days to the dates
}
В форме есть две сетки, поэтому мне нужно применить изменение к соответствующей сетке, и хотя я знаю, что код события DelayGridData_RightClick выполняет то, для чего он предназначен , он никогда не запускается нажатием на контекстное меню «Даты задержки».
Любая помощь или руководство будут с благодарностью!
Большое спасибо
Мартин