ToolStripMenuItem добавлен в несколько мест?

У меня есть большой список объектов, которые пользователь должен выбрать. У меня есть ContextMenuStrip в моем окне и имеет несколько MenuItems для каждой категории сущности.

В примере библиотеки подумайте "Персонал", "Заимствования", "Покровители" и т.д.

"Персонал" может содержать "По типу занятости" → { "Полный рабочий день", "Частичная занятость" } или "По полу" → { "Мужчина", "Женщина" } и т.д.

"Заимствования" могут содержать "По типу" → { "Книги", "Журналы", "DVD" } или "По жанру" → { "Художественная литература" → { "Скай-фи", "Романтика" ), "Преступление" }, "Нехудожественная литература" ( "Наука", "Музыка", "История" }} и т.д.

В принципе, одно лицо может быть в нескольких местах одновременно. Сотрудник может быть полный рабочий день, а самка. Заимствованной может быть книга и роман роман. и др.

Я программно создал List вместе с обработчиками событий, тегами, всем. Затем я программно прошел через каждый из них и добавил их в различные меню и подменю, чтобы их можно было получить из разных мест. Идея состоит в том, что мне нужен только 1 объект в памяти на ToolStripMenuItem, и если он проверяется/не установлен, тогда должен отразиться на всех из них.

Это казалось бы элегантным решением, и я действительно с нетерпением ждал его работы, но, видимо, когда я добавляю ToolStripMenuItem к одному ToolStripMenuItemDropDownItems, он удаляется из любого места, где он был добавлен.

Это меня огорчает. Если бы они были одинаковыми объектами, мне не пришлось бы писать много кода для проверки и проверять все совпадающие элементы, когда один из них проверяется, потому что проверка будет проверять их все, и снятие отметки будет отменено. p >

Есть ли другой способ выполнить это с минимальным кодом?

Это небольшой пример того, что у меня есть:

foreach (ToolStripMenuItem item in staffItems)
{
 Staff s = (Staff)item.Tag;
 foreach (ToolStripMenuItem tsmi in byStaffLocationToolStripMenuItem.DropDownItems)
 if ((Location)tsmi.Tag == s.Location)
 tsmi.DropDownItems.Add(item); // [1] Item added here
 foreach (ToolStripMenuItem tsmi in byStaffTypeToolStripMenuItem.DropDownItems)
 if ((StaffType)tsmi.Tag == s.StaffType)
 tsmi.DropDownItems.Add(item); // removed from [1] and added here instead :(
}
1 ответ

Это свойство ControlCollection. Любой объект, полученный из элемента управления, может находиться только в одном ControlCollection одновременно.

Если вы хотите следовать своему подходу, я предлагаю (проект) введение абстракции для вашей команды:

public interface ICommand
{
 string Name {get;set;}
 bool Enabled { get; set; }
 bool Checked { get; set; }
 void OnClick();
}

Затем вы можете создать свой собственный класс, который будет выводиться из ToolStripMenuItem и взять ICommand в качестве параметра и использовать его OnClick. Теперь вы должны иметь возможность определять один объект, реализующий ICommand для одной команды.

licensed under cc by-sa 3.0 with attribution.