Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

robsonbrumatt

Tenho contextMenuStrip no form mais nao consigo pegar.

Recommended Posts

Ola pessoal! Mais uma vez problemas em mapear os itens de um form.

Crie um form que tem entre outros itens um contextMenuStrip com uns toolStripMenuItem.

Ate aqui tudo bem.

No final do programa preciso identificar todos os toolStripMneuItem de todos os form e para isso criei esse método abaixo de funcionamento simples.

        public List<ToolStripMenuItem> SelecionaMenusPopUpDosFormularios(Form formulario)

        {
            List<ToolStripMenuItem> MeusItems = new List<ToolStripMenuItem>();
            ContextMenuStrip menuStrip = new ContextMenuStrip();


            foreach (var item1 in formulario.Controls)
            {
                if (item1.GetType() == typeof(ContextMenuStrip))
                {
                    foreach (var item2 in ((ContextMenuStrip)item1).Items)
                    {
                        MeusItems.Add((ToolStripMenuItem)item2);
                    }
                }
            }
            return MeusItems;
        }

O método recebe um form e percorre os controles buscando o ContextMenuStrip achando ele registra apenas o primeiro nível dos toolStripMenuItem .

 

O problema é que o contextMenuStrip ta la no form mais aqui nos Controls ele não o encontra.

Observei pelas telas de Debug do intelisence que o ContextMenuStrip e seus toolStripMenuItem existe numa lista de componentes ou container mais como chego ate ele por código apartir da instancia de um formulário já que não estão em Controls.

 

Se alguém puder me orientar o caminho sera de grande ajuda. Gostaria de entender por que não esta nos Controls já que e um controle do form.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicionei ao meu projeto vários formulário e adicionei em cada um deles um contextMenuStrip com alguns toolStripMenuItem.

No final do projeto quero saber a lista de todos os toolStripMenuItens do projeto.

 

Fiz o método acima que recebe um form.

O método acessa o "formulario.Controls" onde eu acho que deveria estar o "contextMenuStrip".

 

do "contextMenuStrip" acesso os seu itens "contextMneuStrip.Itens"

Onde eu acho que devem estar os "toolStripMneuItem".

 

Só que ao executar este método e acompanhar o processo o método localiza vários itens no "formulario.Controsl" como: botoes, textboxs ,labels etc. mais não encontra o "contexMenuStrip".

 

A duvida é se o contextMenuStrip e um controle do formulário por que não esta na lista "formulario.Controls"... e onde ele esta...

 

Este e Parte do código do projeto onde estão declarados o ContextMenuItem e os toolStripMenuItem criados quando clicamos e arrastamos para o formulário mais não aparecem na pesquisa do método de busca em "formulario.Controls".

 

this.excluirBordadoPesqButton = new System.Windows.Forms.Button();
this.sairBordadoPesqButton = new System.Windows.Forms.Button();
this.bordadoPesqContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); <------- aqui
this.incluirNovoBordadoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.alterarBordadoDestacadoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); <-------- aqui
this.excluirBordadoDestacadoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); <-------- aqui
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.zToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele esta dentro dor Form mais não dentro de Form.Control.

E ai esta a situação eu sei que esta dentro do Form só não esta no Control mais não consigo saber onde.esta.

Para exemplificar se você Criar um projeto simples.

Adicionar um ContextMenuItem nesse projeto.

Incluir uns dois itens no ContextMenuItem.

Print este form e vera que o ContextMenuItem esta no Form mais não esta no Form.Controls.

Esta la mais eu não consigo identificar onde.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, isto não vai acontecer mesmo, porque o ContextMenuItem é um objeto do ContextMenu e não do form.

 

No seu caso você teria que ter mais um foreach para passar por todos os contextmenus e seus respectivos filhos.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ola KhaosDoctor.

Realmente você tem razão.


Bem, apos novas analises e consultas a net consegui resolver meu problema.

Descrevo abaixo para aqueles que se encontram numa situação parecida.


O ContexMenuStrip é similar ao MenuStrip diferenciando que o ContexMenuStrip pode ser acoplado a qualquer controle como:TextBox, ComboBox, Botoes etc.


Você pode arrastar o ContextMenuStrip da caixa de ferramentas para o form e customizar a sua vontade e no final definir ou não a qual controle ele sera acoplado.


O acoplamento e feito através de um atributo existente em todo controle que aceita o ContextMenuStrip também chamado "constexMenuStrip".


Mesmo sem definir a que controle seu ContextMenuStrip sera acoplado você pode usar tranquilamente. Como eu fazia.


Bem, em função da minha necessidade em localizar todos os ContextMenuStrip, eu precisei criar um método para esse fim e foi ai meu problema.


Como eu não havia definido a que controle pertencia não conseguia montar um método que funciona-se.


Consegui resolver meu problema mais ainda não sei, ate agora, onde localizar os ContextMenuStrip quando não definidos a que controle pertence.


Diante dos fatos, como meus ContextMenuStrip são utilizados apenas nos DataGridView de alguns formulários eu vinculei os ContextMenuStrip aos DataGridView e pude criar um método para localiza-los focando os DataGridView de cada form o qual descrevo abaixo.




public List<ToolStripMenuItem> SelecionaMenusPopUpDosFormularios(Form formulario)
{
List<ToolStripMenuItem> ListaDeItems = new List<ToolStripMenuItem>();


foreach (var it in formulario.Controls)
{
if (it.GetType() == typeof(DataGridView))
{
if (((System.Windows.Forms.DataGridView)it).ContextMenuStrip != null)
{
foreach (var it2 in ((System.Windows.Forms.DataGridView)it).ContextMenuStrip.Items)
{
if (it2.GetType() == typeof(ToolStripMenuItem))
{
ListaDeItems.Add ((ToolStripMenuItem)it2);
}
}
}
}
}
return ListaDeItems;
}



Bom caso alguém descubra onde localizar os ContextMenuStrip quando não definidos a que controle pertence informa ai sera muito legal saber!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.