2012-06-11 3 views
0

У меня есть общий ContextMenuStrip для каждого контроля рабочего пространства моего приложения. Этот ContextMenuStrip содержит 4 элемента («Переместить вперед», «Переместить назад» и «Удалить элемент управления»).Как расширить существующий ContextMenuStrip?

Теперь я хочу расширить его для одного элемента управления. На этом элементе есть DataGridView, и я хочу, чтобы дополнительный элемент удалял выбранный DataGridViewRow.

Это код, который я попробовал:

private void extendContextMenuOfDataGridViewRow (DataGridViewRow row) { 
     ContextMenuStrip ctx = new ContextMenuStrip(); 
     foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) { 
      ctx.Items.Add(item); 
     } 
     ctx.Items.Add(new ToolStripSeparator()); 
     ToolStripMenuItem ctxDeleteRow = new ToolStripMenuItem("Delete row"); 
     ctxDeleteRow.Name = "ctxDeleteRow"; 
     ctxDeleteRow.Click += new EventHandler(ctxDeleteRow_Click); 
     ctx.Items.Add(ctxDeleteRow); 

     row.ContextMenuStrip = ctx; 
    } 

После того, как первый элемент цикла foreach был добавлен в ctx.Items отладчик оставляет весь метод и первый элемент отсутствует в общей ContextMenuStrip.

Как мне это сделать?

+0

«Переместить фронт», «вернуться назад» и «удалить управление» = 3 элемента, а не 4. – walther

+0

Что именно вы пытаетесь достичь? Вы хотите добавить MenuItem в свой ContextMenuStrip, когда произойдет событие? –

+0

Я написал [separator] как четвертый элемент (но, как html-теги). Я думаю, что это причина, по которой она исчезла. – pinki

ответ

0

Если вы хотите расширить функционально некоторый контроль, вы можете либо

а) создать метод расширения

public void DoSomething(this MyExtendedControl mec, DataGridViewRow row) 
{ 
} 

б) создать новый класс, унаследованный от вашего неудовлетворительного контроля (или даже создать совершенно новый элемент управления), когда вы можете изменить/добавить вещи, как нужно

в зависимости от ваших конкретных потребностей, не мог понять из вашего описания ...

+0

Я не понимаю, как использовать методы расширения для моей проблемы. – pinki

+0

@pinki, может быть, попытаться лучше объяснить вашу проблему ... Кажется, я не единственный, кто этого не понимает. – walther

+0

Я хочу добавить новый элемент в существующий 'ContextMenuStrip', который видим только для одного элемента управления. – pinki

0

Я не работал с WinForms целую вечность, но вы уверены, что можете сохранить тот же объект , назначенный сразу двум различным Strip?

foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) { 
    ctx.Items.Add(item); 
} 

Я серьезно сомневаюсь, что это должно работать в соответствии с проектом, поскольку строка должна «говорить» с его родителем, и добавив его в другую полосу, я боюсь, что вы переназначения родителя.

Вместо этого, я бы добавил пункт к общему меню, но с его свойством Visible к false.
Тогда я поймаю событие открытия меню и сделаю предмет видимым, если цель DataGridViewRow.

+0

Я хочу установить расширенный 'ContextMenuStrip' в объект' Row' параметра. Этот объект 'Row' не имеет никакого' ContextMenuStrip' в это время. «ContextMenuStrip», который я хочу расширить, - это элемент управления, который содержит «DataGridView». – pinki

+0

Что я вижу, вы принимаете * существующий * 'ContextMenuStrip' и создаете * новый * (' ctx'). Нет такой вещи, как «расширение» объекта на C#. И я хочу сказать, что если вы добавите элементы в 'ctx', они, скорее всего, исчезнут из исходного.Таким образом, вам будет лучше иметь ** ту же полосу контекстного меню **, назначаемую * оба * для строк и других элементов управления, и отображение/скрытие элемента «Удалить строку» в зависимости от контекста. –

+0

Я попробую. Спасибо! – pinki

Смежные вопросы