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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ContextMenuStrip, проблемки с контекстным меню 
:(
    Опции темы
lioness
Дата 25.8.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я дублирую из основного меню MenuStrip одну веточку в контекстное меню.

После того, как пишу 
Код

ctxtMenuView.Items.Add(menuView);


это самое "View" из основного меню исчезает и начинает работать только в контекстном.  smile 

Что-то типа, как стоит у меня в примере, "menu.Clone()" я в VS 2005 не нашла  smile 

Как мне правильно задублировать менюшку: и на главное и на контекстное. На МДСН бестолковый пример какой-то на контестное меню
PM MAIL   Вверх
mr.DUDA
Дата 25.8.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Было и у меня такое, пришлось руками копировать меню поэлементно.


--------------------
user posted image
PM MAIL WWW   Вверх
lioness
Дата 25.8.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Копировала... Компилятор не проходит вот эта строка 
Код

 ctxtMenuView.Items.Add(cms);

Цитата

The best overloaded method match for 'System.Windows.Forms.ToolStripItemCollection.Add(string)' has some invalid arguments

Какой стринг, если cms и menuImage - одного класса ...   С   menuImage значитьЦа никаких проблем, а с другим вдруг "Стринг" !
А если убрать строку и запустить, то вылетает на ошибку в foreach
Код

private void DefineContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip();
            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi);
             //ctxtMenuView.Items.Add(menuImage);
             ctxtMenuView.Items.Add(cms);
        }

Цитата

Collection was modified; enumeration operation may not execute


Я неправильно копирую? smile 

Это сообщение отредактировал(а) lioness - 25.8.2006, 16:10
PM MAIL   Вверх
reloni
Дата 25.8.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(lioness @  25.8.2006,  16:09 Найти цитируемый пост)
Я неправильно копирую?  

Неправильноsmile
Используй for вместо foreach, если нужно что-то модифицировать.
PM MAIL ICQ   Вверх
lioness
Дата 25.8.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А, да и правда... Что-то припоминаю про foreach. Но я спИсывала вот тут с учебника:
Код

private void DefineContextMenu()
{
// Copy the View menu into ctxtMenuView
foreach (MenuItem mi in menuView.MenuItems)
{
ctxtMenuView.MenuItems.Add (mi.Index, mi.CloneMenu());
}
}


Только у меня КлонаМеню что-то нет. Отменили наверное.

А отчего тогда вот эту строку компилятор не жрёть:
Код

ctxtMenuView.Items.Add(cms);
 
У меня стоит двумя строками объявление 
Код

ContextMenuStrip cms = new ContextMenuStrip();

а он мне "Стриииииииииинг". 
PM MAIL   Вверх
ivashkanet
  Дата 28.8.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



lioness, если уж даешь код, то давай весь нужный. 
Например что за объекты menuImage, ctxtMenuView, menuView?

Это сообщение отредактировал(а) ivashkanet - 28.8.2006, 09:08
PM MAIL WWW ICQ   Вверх
lioness
Дата 28.8.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделано незамысловатое "выпадающее" меню (по-новому, которое "StripMenu")

        
Код

private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            //   . . . . . . . . . . . .             
             this.menuFile = new System.Windows.Forms.MenuStrip();
            this.menuExit = new System.Windows.Forms.ToolStripMenuItem();
            this.menuLoad = new System.Windows.Forms.ToolStripMenuItem();
            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.menuView = new System.Windows.Forms.ToolStripMenuItem();
            this.menuImage = new System.Windows.Forms.ToolStripMenuItem();
            this.menuStretch = new System.Windows.Forms.ToolStripMenuItem();
            this.menuActual = new System.Windows.Forms.ToolStripMenuItem();
            // . . . . . . . . . . . . . 

           // 
            // menuFile
            // 
            this.menuFile.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuExit,
            this.menuView});
            this.menuFile.Location = new System.Drawing.Point(0, 0);
            this.menuFile.Name = "menuFile";
            this.menuFile.Size = new System.Drawing.Size(627, 24);
            this.menuFile.TabIndex = 1;
            this.menuFile.Text = "menuStrip1";
            // 
            // menuExit
            // 
            this.menuExit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuLoad,
            this.exitToolStripMenuItem});
            this.menuExit.Name = "menuExit";
            this.menuExit.Size = new System.Drawing.Size(35, 20);
            this.menuExit.Text = "&File";
            // 
            // menuLoad
            // 
            this.menuLoad.Name = "menuLoad";
            this.menuLoad.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L)));
            this.menuLoad.Size = new System.Drawing.Size(145, 22);
            this.menuLoad.Text = "&Load";
            this.menuLoad.Click += new System.EventHandler(this.menuLoad_Click);
            // 
            // exitToolStripMenuItem
            // 
            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
            this.exitToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
            this.exitToolStripMenuItem.Text = "E&xit";
            this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
            // 
            // menuView
            // 
            this.menuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuImage});
            this.menuView.Name = "menuView";
            this.menuView.Size = new System.Drawing.Size(41, 20);
            this.menuView.Text = "&View";
            // 
            // menuImage
            // 
            this.menuImage.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuStretch,
            this.menuActual});
            this.menuImage.Name = "menuImage";
            this.menuImage.Size = new System.Drawing.Size(115, 22);
            this.menuImage.Text = "&Image";
            // 
            // menuStretch
            // 
            this.menuStretch.Enabled = false;
            this.menuStretch.Name = "menuStretch";
            this.menuStretch.Size = new System.Drawing.Size(148, 22);
            this.menuStretch.Text = "S&tretch to Fit";
            this.menuStretch.Click += new System.EventHandler(this.menuImage_ChildClick);
            // 
            // menuActual
            // 
            this.menuActual.Enabled = false;
            this.menuActual.Name = "menuActual";
            this.menuActual.Size = new System.Drawing.Size(148, 22);
            this.menuActual.Text = "&Actual Size";
            this.menuActual.Click += new System.EventHandler(this.menuImage_ChildClick);
            // . . . . . . . . . . . .
        private System.Windows.Forms.MenuStrip menuFile;
        private System.Windows.Forms.ToolStripMenuItem menuExit;
        private System.Windows.Forms.ToolStripMenuItem menuLoad;
        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem menuView;
        private System.Windows.Forms.ToolStripMenuItem menuImage;
        private System.Windows.Forms.ToolStripMenuItem menuStretch;
        private System.Windows.Forms.ToolStripMenuItem menuActual;

        private System.Windows.Forms.PictureBoxSizeMode[] modeMenuArray =
            {
                System.Windows.Forms.PictureBoxSizeMode.StretchImage,
                System.Windows.Forms.PictureBoxSizeMode.Normal
            };
        private int _selectedImageMode = 0;



Открыть файл-фото, закрыть все, показать в натуральную величину или "тянуть" размер следом за формой.  "Sub - меню", которые  "StrechImage" и "Normal" стоят с "галочкой", т.е. один из двух режимов. Я уж не буду расписывать все events. Работает менюшка. 
Потом добавлен ContentxMenuStrip в положенных местах дизайнейра, чтобы продублировать веточку менюшки View в контект-меню:

          
Код

this.ctxtMenuView = new System.Windows.Forms.ContextMenuStrip(this.components);
  
          // привязывается в фото-боксу, куда файл-фотка вызывается
            this.pbxPhoto.ContextMenuStrip = this.ctxtMenuView;
 
            // ctxtMenuView
            // 
            this.ctxtMenuView.Name = "ctxtMenuView";
            this.ctxtMenuView.Size = new System.Drawing.Size(61, 4);
            // . . . . . . . . . . . 
            private System.Windows.Forms.ContextMenuStrip ctxtMenuView;
  

Согласно книжке добавлен в конструктор Define для контекста

 
Код

            InitializeComponent();
            DefineContextMenu();


И вот сразу после этого дифайна веточка View  в меню сверху стоит "голая". Она начинает работать только в контекстном меню.

В книжке процедура предложена так:
Код

private void DefineContextMenu()
{// Copy the View menu into ctxtMenuView
foreach (MenuItem mi in menuView.MenuItems)
{
ctxtMenuView.MenuItems.Add
(mi.Index, mi.CloneMenu());
}
}


Т.е. КЛОН   Наверное, так было правильно в той версии. Здесь этот конструктор вообще через компилятор не проходит и подсказки ".Clone" нет. Я написАла так:
Код


        private void DefineContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip();
            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi);
  
            ctxtMenuView.Items.Add(cms);
        }

     }


Компилятор лается, что под 'System.Windows.Forms.ToolStripItemCollection.Add(string)'  аргумент-инвалид. Я ему предложила так:

Код

            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi.ToString());


Та же самая ошибка в компиляторе.

А если поставить просто одну строку 
Код

        private void DefineContextMenu()
        {
           ctxtMenuView.Items.Add(menuImage);
        }


то ветка их верхнего меню исчезает, как я уже сказала. Стоит одна "голая" View", а "Image" перемещается в контекст. Меню нормально работает, но только в новом контекстном месте. Как-то элементарно нужно склонировать, продублировать. В МДСН всё вообще по-другому в контекстном стоит.  Может быть, можно мой DefineContextMenu парами строчек исправить?
     
PM MAIL   Вверх
VisualProgrammerNET
Дата 1.9.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Сразу вопрос (даже не просматривая код):
Если компилятор чётко просит в параметрах функции menu.Add передать стринг, почему бы не дать ему этот стринг? Насколько я понимаю, этот метод просто добавит одну строку меню с заданным названием. А потом обработчики этой строки нужно будет программить отдельно. 
Можно хоть до посинения передавать вместо стринга другое меню, но компилятор тебе обмануть или переубедить не удастся. Сколько я ни пробовал - не вышло до сих пор  smile 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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