none
Instanciando um formulario dinamicamente com passagem de parametro(classe) RRS feed

  • Pergunta

    Meu nome é Julio Cesar, e estou iniciando no C#, desenvolvi um aplicativo onde cadastra-se      Empresa,filial,usuário, sistema,tela, telaXusuario, e usuárioXfilial....

    A ideia é o usuário logar-se no sistema(tela login chama tela menu), e na tela menu, o menu é montado dinamicamente em função das liberações que o usuário possui.

    Bom tudo isso está funcionando blz, meu problema está em chamar o formulário.

    Exemplo de como eu chamava formulário quando o menu era fixo( e funcionava perfeitamente):

     

          private void empresaToolStripMenuItem_Click(object sender, EventArgs e)
    
            {
    
                EmpresaForm obj = new EmpresaForm(InstanciaLogin);
    
                obj.Show();
    
            }

    InstanciaLogin, é a classe do formulario Login que foi dado um Hide após a validação do usuário e a carga do form menu.

    Agora, com o menu dinâmico ao pressionar click na opção desejada executo o seguinte código:

    public void MetodoQueRecebeClick_Click(object sender, EventArgs e)
    
            {
    
                string nomeForm = ((ToolStripMenuItem)sender).Name;
    
                Form _form = (Form)Activator.CreateInstance(null, "Seguranca.GUI." + nomeForm + "(InstanciaLogin)").Unwrap();
    
                _form.MdiParent = this;
    
                _form.Show();
    
            } 

    No caso estou chamado o form FilialForm:

    namespace Seguranca.GUI
    
    {
    
        public partial class FilialForm : Form
    
        {
    
            Login InstanciaLogin;
    
    
            public FilialForm(Login lg)  
    
            {    
    
                InitializeComponent();
    
                InstanciaLogin = lg;
    
                CarregaCombo();
    
                AtualizaGrid();
    
                descricaoTXT.Focus();
    
            }

    Note que filial form recebe InstanciaLogin.

    Porém ao executar a aplicação, ocorre o seguinte erro em:

    Form _form = (Form)Activator.CreateInstance(null, "Seguranca.GUI." + nomeForm + "(InstanciaLogin)").Unwrap();

    TypeLoadException was unhandled

    Não foi possível carregar o tipo Seguranca.GUI.FilialForm(InstanciaLogin) do assembly GUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

    Alguém tem alguma sugestão para esse problema ?

    Desde já obrigado !


    • Editado Marcos SJ segunda-feira, 29 de fevereiro de 2016 14:49 Edição
    segunda-feira, 29 de fevereiro de 2016 14:05

Respostas

  • Bom dia Julio, não sei se estou olhando errado, me tira uma dúvida: se o nome é FilialForm, o fato de concatenar com (InstanciaLogin) não vai gerar problema?

    Rodrigo Reis Ferreira
    Microsoft Certified

    Oi Rodrigo, eu preciso "guardar" o login do usuário que está logada, para tanto, estou criando uma classe Login(formulário) no menu e nas telas destino(FilialForm).

    Quando o sistema sai da tela de login p/ o menu a tela login fica hide.

    Se vc. observar, na logica da FilialForm verá que estou criando um objeto to tipo login chamado InstanciaLogin e no método construtor do formulário ele recebe essa classe como parâmetro.

    Agora se existir outra forma de "propagar" o login do usuário para as demais telas, tmb. resolveria meu problema ... 

    Mais uma vez obrigado pela atenção.

    public partial class FilialForm : Form
        {
           Login InstanciaLogin;
            public FilialForm(Login lg)  
    terça-feira, 1 de março de 2016 12:17

Todas as Respostas

  • Boa tarde, a classe é FilialForm(InstanciaLogin)?? Existe de fato dentro do namespace GUI?

    Rodrigo Reis Ferreira
    Microsoft Certified

    segunda-feira, 29 de fevereiro de 2016 19:43
  • Oi Rodrigo, 

    Existe sim veja O XML gui.csprj 

    
    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
        <ProductVersion>8.0.30703</ProductVersion>
        <SchemaVersion>2.0</SchemaVersion>
        <ProjectGuid>{4B6983A8-86A3-4F2E-B803-C06A3EB1E05E}</ProjectGuid>
        <OutputType>WinExe</OutputType>
        <AppDesignerFolder>Properties</AppDesignerFolder>
        <RootNamespace>GUI</RootNamespace>
        <AssemblyName>GUI</AssemblyName>
        <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
        <TargetFrameworkProfile>Client</TargetFrameworkProfile>
        <FileAlignment>512</FileAlignment>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
        <PlatformTarget>x86</PlatformTarget>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
        <PlatformTarget>x86</PlatformTarget>
        <DebugType>pdbonly</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>bin\Release\</OutputPath>
        <DefineConstants>TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <PropertyGroup>
        <StartupObject>
        </StartupObject>
      </PropertyGroup>
      <ItemGroup>
        <Reference Include="System" />
        <Reference Include="System.Core" />
        <Reference Include="System.Xml.Linq" />
        <Reference Include="System.Data.DataSetExtensions" />
        <Reference Include="Microsoft.CSharp" />
        <Reference Include="System.Data" />
        <Reference Include="System.Deployment" />
        <Reference Include="System.Drawing" />
        <Reference Include="System.Windows.Forms" />
        <Reference Include="System.Xml" />
      </ItemGroup>
      <ItemGroup>
        <Compile Include="EmpresaForm.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="EmpresaForm.Designer.cs">
          <DependentUpon>EmpresaForm.cs</DependentUpon>
        </Compile>
        <Compile Include="FilialForm.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="FilialForm.Designer.cs">
          <DependentUpon>FilialForm.cs</DependentUpon>
        </Compile>
        <Compile Include="Login.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="Login.Designer.cs">
          <DependentUpon>Login.cs</DependentUpon>
        </Compile>
        <Compile Include="MenuForm.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="MenuForm.Designer.cs">
          <DependentUpon>MenuForm.cs</DependentUpon>
        </Compile>
    

    segunda-feira, 29 de fevereiro de 2016 20:03
  • Detalhe Rodrigo, se eu tento instanciar(dinamicamente) um form "normal", sem a passagem do IntanciaLogin, funciona perfeitamente ... 

    segunda-feira, 29 de fevereiro de 2016 20:07
  • Bom dia Julio, não sei se estou olhando errado, me tira uma dúvida: se o nome é FilialForm, o fato de concatenar com (InstanciaLogin) não vai gerar problema?

    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 1 de março de 2016 11:32
  • Bom dia Julio, não sei se estou olhando errado, me tira uma dúvida: se o nome é FilialForm, o fato de concatenar com (InstanciaLogin) não vai gerar problema?

    Rodrigo Reis Ferreira
    Microsoft Certified

    Oi Rodrigo, eu preciso "guardar" o login do usuário que está logada, para tanto, estou criando uma classe Login(formulário) no menu e nas telas destino(FilialForm).

    Quando o sistema sai da tela de login p/ o menu a tela login fica hide.

    Se vc. observar, na logica da FilialForm verá que estou criando um objeto to tipo login chamado InstanciaLogin e no método construtor do formulário ele recebe essa classe como parâmetro.

    Agora se existir outra forma de "propagar" o login do usuário para as demais telas, tmb. resolveria meu problema ... 

    Mais uma vez obrigado pela atenção.

    public partial class FilialForm : Form
        {
           Login InstanciaLogin;
            public FilialForm(Login lg)  
    terça-feira, 1 de março de 2016 12:17