Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание элементов контекстного меню 
:(
    Опции темы
ajunta
Дата 12.9.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Привет!

Идея задачи такая - есть много объектов на форме, для каждого из которых должно быть доступно контекстное меню. Причеи элементы жэтого меню - для каждого свои. Точнее так - есть набор элементов меню, характерный для всех, и в довесок к нему нужно создать еще элементов.

На простом примере пытаюсь реализовать это так:

в contextMenuStrip1 дизайн-тайм создал характерные для всех элементы,
а contextMenuStrip2 повесил как общий компанент для контекстного меню, далее:

Код

        private void contextMenuStrip2_Opening(object sender, CancelEventArgs e)
        {
            contextMenuStrip2.Items.Clear(); //очищение преыддузего состояниея
//дополнение текущего списка характерными элементами
            for (int i=0; i<contextMenuStrip1.Items.Count;i++)
            {
                contextMenuStrip2.Items.Add(contextMenuStrip1.Items[i]);
            }
//добалвение индивидуальных элементов
            for (int i=0; i<4;i++)
            {
                contextMenuStrip2.Items.Add("Hello ! "+i.ToString());
            }
        }


так вот это работает только один раз, а потом помсле 
contextMenuStrip2.Items.Clear(); элементов не остается ни в contextMenuStrip2, ни в contextMenuStrip1. И при следубющем клике видны только индивидуальные элементы, а общие потеряны.

что я делаю не так?

PM MAIL   Вверх
Dennnis
Дата 12.9.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Вот этим
Код

            for (int i=0; i<contextMenuStrip1.Items.Count;i++)
            {
                contextMenuStrip2.Items.Add(contextMenuStrip1.Items[i]);
            }
ты ПЕРЕМЕЩАЕШЬ все элементы меню из contextMenuStrip1 в contextMenuStrip2.
Вот этим
Цитата(ajunta @  12.9.2008,  15:20 Найти цитируемый пост)
 contextMenuStrip2.Items.Clear(); 
ты их удаляешь.
После этого у тебя нет элементов ни в contextMenuStrip1 ни в contextMenuStrip2.

Добавлено через 6 минут и 18 секунд
Вместо contextMenuStrip2.Items.Clear() воспользуйся contextMenuStrip2.Items.RemoveAt(int index), и удаляй только динамически созданные элементы.

Это сообщение отредактировал(а) Dennnis - 12.9.2008, 16:46
--------------------
Get Rich or Die Tryin'
PM   Вверх
Wanderer2019
Дата 12.9.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



ajunta
какой то не совсем удачный способ. Уж лучше в XML хранить список меню для конкретного объекта.
PM ICQ MSN   Вверх
Bishop
Дата 13.9.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



ajunta, я бы сразу заполнил меню всеми пунктами, а при его раскрытии скрывал ненужные. Простейшая реализация:
Код
// флаги отображения
enum ShowOpt
{
    Button = 1,
    TextBox = 2,
    ListBox = 4
}
// общие пункты contextMenuStrip1 созданы в design time
private void FormMain_Load(object sender, EventArgs e)
{
    // назначаем меню
    button1.ContextMenuStrip = listBox1.ContextMenuStrip = contextMenuStrip1;
    // задаём контролам флаги тех пунктов, которые хотим на них видеть
    button1.Tag = ShowOpt.Button;
    listBox1.Tag = ShowOpt.ListBox;
    // создаём зависимые пункты меню и присваиваем им флаги отображения
    contextMenuStrip1.Items.Add("Button").Tag = ShowOpt.Button | ShowOpt.TextBox; // а этот пункт будет показываться для двух классов
    contextMenuStrip1.Items.Add("ListBox").Tag = ShowOpt.ListBox;
    // понятно, что всё это нужно делать не вручную
}

private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
    // проходимся по всем пунктам меню
    foreach (ToolStripItem item in contextMenuStrip1.Items)
    {
        if (item.Tag != null) // пустой у общих пунктов
        {
            // проверяем совпадение масок, результат проверки -> видимость пункта
            item.Visible = ((ShowOpt)item.Tag & (ShowOpt)(sender as ContextMenuStrip).SourceControl.Tag) > 0;
        }
    }
}


PM WWW ICQ   Вверх
ajunta
Дата 15.9.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Спасибо!, разобрался! Удалять дополтные элементы действиетльно проще smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.