#c#
#c#
Вопрос:
У меня есть один, ContextMenuStrip
прикрепленный к двум элементам управления (DataGridView).
В ToolStripMenuItem
событии click в настоящее время я использовал: this.ActiveControl.Name
для получения имени активного элемента управления GridView;
Это нормально, если я сначала выберу ячейку GridView, а затем Rt. щелкните по ней, чтобы вызвать ContextMenu
Случай: иногда, если элемент управления GridView не является активным элементом управления и ячейка предварительно выбрана, щелчок по элементу контекстного меню не срабатывал соответствующим образом.
Есть ли какой-либо способ получить имя владельца, которое инициирует событие щелчка по элементу контекстного меню?
В настоящее время в событии щелчка ToolStripMenuItem мне удалось получить исходный вызывающий объект (т. Е. DataGridView) с помощью этого кода:
private void CopytoolStripMenuItem1_Click(object sender, EventArgs e)
{
var grid = new DataGridView();
switch (this.ActiveControl.Name)
{
case "dGVEL1":
{
grid=dGVEL1;
break;
}
case "dGVEL2":
{
grid=dGVEL2;
break;
}
}
if (grid == null) return;
DataObject data = grid.GetClipboardContent();
Clipboard.SetDataObject(data);
}
Комментарии:
1. Элемент ToolStripMenuItem = отправитель в качестве ToolStripMenuItem; имя строки = item.Name;
2. Это даст только название элемента контекстного меню. Я хочу получить имя владельца, которое инициирует событие щелчка по элементу контекстного меню. т. е. Имя элемента управления DataGridView.
3. Поэтому используйте item. Родительский
4. элемент. Родительский метод не существует, но существует GetCurrentParent() и var name = item. GetCurrentParent(); Он возвращает «contextMenuStrip1»
5. элемент. Родительский метод не существует, кроме элемента. GetCurrentParent() и item. Владелец. Name exists Оба возвращают «contextMenuStrip1»
Ответ №1:
Наконец-то я решил проблему.. Полное решение
private void CopytoolStripMenuItem1_Click(object sender, EventArgs e)
{
ToolStripDropDownItem item = sender as ToolStripDropDownItem;
if (item == null) // Error
return;
ContextMenuStrip strip = item.Owner as ContextMenuStrip;
var grid = strip.SourceControl as DataGridView;
if (grid == null) // Control wasn't a DGV
return;
switch (grid.Name)
{
case "dGVEL1":
{
grid=dGVEL1;
break;
}
case "dGVEL2":
{
grid=dGVEL2;
break;
}
}
if (grid == null) return;
DataObject data = grid.GetClipboardContent();
Clipboard.SetDataObject(data);
}
Ответ №2:
Есть ли какой-либо способ получить имя владельца, которое инициирует событие щелчка по элементу контекстного меню?
Я отработал решение, которое вы нашли, и упростил его. Надеюсь, это может помочь некоторым будущим читателям, которые ищут более общее решение.
Похоже, что вы проходите совсем немного, чтобы получить доступ к ContextMenuStrip, который уже передается как sender
(при условии, что вам все равно нужно будет его использовать). Ниже приведено более общее решение этой проблемы, и оно немного проще.
private void contextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {
//Cast the parent as a context menu strip so we can access 'sourceControl' attribute
ContextMenuStrip strip = (ContextMenuStrip) sender;
var stripParent = strip.SourceControl;
//print the name of the 'parent' (Control that called the context menu)
System.Diagnostics.Debug.WriteLine("Called From: " stripParent.Name);
}