ToolStripMenuItem добавлен в несколько мест? - PullRequest
3 голосов
/ 08 июня 2011

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

В примере с библиотекой, подумайте "Staff", "Borrowables", "Patrons" и т. Д. *

«Штат» может содержать «По типу занятости» -> {«Полная занятость», «Неполный рабочий день»} или «По полу» -> {«Мужской», «Женский»} и т. Д.

«Заимствованные» могут содержать «По типу» -> {«Книги», «Журналы», «DVD»} или «По жанру» -> {«Художественная литература» -> {«Научно-фантастический», «Романтика», «Преступление»"}," Non-Fiction "{" Наука "," Музыка "," История "}} и т. Д.

По сути, одна сущность может находиться в нескольких местах одновременно.Сотрудник может быть как штатным, так и женским.Заемщиком может быть книга и роман.и т.д.

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

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

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

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

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

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 Ответ

1 голос
/ 18 июня 2011

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

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

public interface ICommand
{
    string Name {get;set;}
    bool Enabled { get; set; }
    bool Checked { get; set; }

    void OnClick();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...