2
respostas

User Control Hello World: Problema ao inserir o form

Pessoal, Estou tentando fazer o exercício para a inclusão do formulário Frm_HelloWorld_UC do tipo Form, porém após copiar o código abaixo no click do menu no form principal:

       private void helloWorldToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Frm_HelloWorld_UC hw = new Frm_HelloWorld_UC();
            TabPage tb = new TabPage();
            tb.Name = "Hello World";
            tb.Text = "Hello World";
            tb.Controls.Add(hw);
            Tbc_Aplicacoes.TabPages.Add("Hello World");

        }

Recebo o seguinte erro no momento do acionamento do item de menu: System.ArgumentException: 'Não é possível adicionar o controle de nível superior a um controle.'

Pesquisando um pouco encontrei um forum onde dava-se o conselho de adicionar o seguinte comando antes de inserir o form no TabPage:

hw.TopLevel = false;

Após adicionar esta linha, o código ficou assim, e o erro não apareceu mais:

       private void helloWorldToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Frm_HelloWorld_UC hw = new Frm_HelloWorld_UC();
            TabPage tb = new TabPage();
            tb.Name = "Hello World";
            tb.Text = "Hello World";
            hw.TopLevel = false;
            tb.Controls.Add(hw);
            Tbc_Aplicacoes.TabPages.Add("Hello World");
        }

Porém, a form Frm_HelloWorld_UC que adicionei como User Control Form não aparece dentro do tab. Vejam a imagem do form ao executar a aplicação.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém poderia dar uma dica de como resolver? Seria bom verificar também o texto da lição caso eu tenha seguido os passos corretamente e haja algum ajuste a ser feito para o código rodar.

2 respostas

José,

Desculpe, mas eu estou achando que você colou o código acima fora de alguma hierarquia.

Precisa estar dentro do "NameSpace NomeNameSpace" / "public partial class NomeFome : Form" / "public NomeForme()" ou outra função dentro da classe como no exemplo abaixo a "contextOpening"... Veja este exemplo:

namespace Projet_test
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent(); //Contain this line: this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
    }

    //called by the Opening evenHandler of the context menu.
    private void contextOpening(object sender, CancelEventArgs e)
    {
      int j = 0;
      int total = menu1ToolStripMenuItem.DropDownItems.Count;
      for (int i = 0; i < total; i++)
      {
        contextMenuStrip1.Items.Insert(j, menu1ToolStripMenuItem.DropDownItems[0]);
        j++;
      }
    }

    //called by the Closed evenHandler of the context menu.
    private void contextClosed(object sender, ToolStripDropDownClosedEventArgs e)
    {
      int j = 0;
      int total = contextMenuStrip1.Items.Count;
      for (int i = 0; i < total; i++)
      {
        menu1ToolStripMenuItem.DropDownItems.Insert(j, contextMenuStrip1.Items[0]);
        j++;
      }
    }
  }
}

Referência:

==========================================================

Add ToolStripItem into ContextMenuStrip

https://stackoverflow.com/questions/49134534/add-toolstripitem-into-contextmenustrip

==========================================================

Espero ter ajudado.

[]'s,

Fabio I.

Olá, Fábio

Acho que não é o caso. Veja o código completo da classe Frm_HelloWorld_UC.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CursoWindowsForms
{
    public partial class Frm_HelloWorld_UC : UserControl
    {
        public Frm_HelloWorld_UC()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Btn_AloMundo_Click(object sender, EventArgs e)
        {
            Lbl_AloMundo.Text = Txt_AloMundo.Text;
        }
    }
}

Revisitei o código verificando se havia algo deslocado em relação ao bloco de código do namespace, mas não há nada fora da chamada de namespace. Uma coisa que percebi durante a construção dos códigos enquanto fazia os treinamento é que quando havia código fora do bloco do namespace o compilador reclamava, o que não ocorre neste código. A única coisa que pode estar ocorrendo no momento seria a posição do Frm_HelloWorld_UC em um namespace diferente do FRM que o chama, mas o FRM principal está usando o namespace do form e não está havendo erro de complicação. Veja o código do FRM principal abaixo:

using CursoWindowsForms;

namespace WindowsFormsModulo2
{
    public partial class Frm_Principal_Menu_UC : Form
    {
        public Frm_Principal_Menu_UC()
        {
            InitializeComponent();
        }
        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void demonstraçãoKeyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Frm_DemonstracaoKey DemonstraçãoKey = new Frm_DemonstracaoKey();
            DemonstraçãoKey.ShowDialog();
        }

        private void helloWorldToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Frm_HelloWorld_UC hw = new Frm_HelloWorld_UC();
            TabPage tb = new TabPage();
            tb.Name = "Hello World";
            tb.Text = "Hello World";
            tb.Controls.Add(hw);
            Tbc_Aplicacoes.TabPages.Add("Hello World");

        }
        ...
    }
}