none
Jogar valor em Form, aberto sem criar uma nova Instância. RRS feed

  • Pergunta

  • Pessoal é o seguinte eu tenho meu formulário chamado (frmOrcamento) e tenho outro chamado de (frmCadCliente):

    Criei um evento keyPress no TextBox (txtNomeCliente) e defini seu Modifiers como(Public), quando pressiona ENTER ele abre uma nova instância do (frmCadCliente).

    Já no formOrcamento, ele seta o valor do (Id) do cliente no (txtNomeCliente), na verdade dá certo mais ele acaba criando uma nova instância do (frmOrcamento) e ficando no caso dois (frmOrcamento), queria saber como fechar a primeira instância e ficar apenas a segunda.

    segunda-feira, 31 de março de 2014 11:38

Todas as Respostas

  • Olá, para fechar uma instancia de um form, você usa o método OpenForms para buscar a instancia desse form, com esse metodo vc tanto le a instancia quando fecha ex :

    //lendo a instacia
    FormOrcamento f = Application.OpenForms["FormOrcamento"] as FormOrcamento;
    
    if(f != null)
    {
      f.Close();
    
    }

    segunda-feira, 31 de março de 2014 11:53
  • Vou testar amigo.
    segunda-feira, 31 de março de 2014 11:59
  • Fiz assim:

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
                if (f != null)
                {
                    f.Close();
    
                }
                frmOrcamento fr = new frmOrcamento();
                fr.txtCodCliente.Text = "Teste";
                this.Close();
                fr.Show();

    Mais ele fecha as duas Instancias;

    segunda-feira, 31 de março de 2014 12:05
  • Fiz assim:

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
                if (f != null)
                {
                    f.Close();
    
                }
                frmOrcamento fr = new frmOrcamento();
                fr.txtCodCliente.Text = "Teste";
                this.Close();
                fr.Show();

    Mais ele fecha as duas Instancias;

    Modifiquei e fiz de novo assim, mais ainda fecha as duas instâncias.

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        this.Close();
        fr.Show();

    segunda-feira, 31 de março de 2014 12:09
  • Do jeito que fez sim, fecha as duas mas o que queria que fizesse, não entendi ? Não era fechar uma instância somente.
    segunda-feira, 31 de março de 2014 12:09
  • Isso, é porque é assim, eu quero passar informações para um o txtCodCliente em um formulário já aberto, isso eu já consegui, mais quando crio uma nova instância tipo : frmOrcamento fr = new frmOrcamento();

    O valor vai para a nova instância ficando a antiga instância aberta e sem receber o resultado, por isso queria fecha-la


    • Editado Raniel Nogueira segunda-feira, 31 de março de 2014 12:17 Erro de digitação
    segunda-feira, 31 de março de 2014 12:14
  • Então retire o This.Close() que deve funcionar.
    segunda-feira, 31 de março de 2014 12:22
  • Já tentei fazer retirando o This.Close(), mais fica do mesmo jeito

    Fiz assim:

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        this.Close();
        fr.Show();

    segunda-feira, 31 de março de 2014 12:37
  • Já tentei fazer retirando o This.Close(), mais fica do mesmo jeito

    Fiz assim:

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        this.Close();
        fr.Show();

    O correto seria :

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
    if(f != null)
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        fr.Show();

    Copie e cole assim que vai funcionar.

    segunda-feira, 31 de março de 2014 12:45
  • Já tentei fazer retirando o This.Close(), mais fica do mesmo jeito

    Fiz assim:

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        this.Close();
        fr.Show();

    O correto seria :

    frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
    if(f != null)
        f.Close();
    
        frmOrcamento fr = new frmOrcamento();
        fr.txtCodCliente.Text = "Teste";
        fr.Show();

    Copie e cole assim que vai funcionar.

    Mesmo problema infelizmente.
    segunda-feira, 31 de março de 2014 12:52
  • Queria tentar de outra maneira então, quando pressionar ENTER no (txtCodCliente), fechar o (frmOrcamento) e instânciar  (frmCadCliente) e chama-lo.

    Já tentei assim:

    if (e.KeyCode == Keys.Enter)
                {
                    frmCadCliente frm = new frmCadCliente();
                    this.Close();
                    frm.Show();
                }

    Mais fica do mesmo jeito, fecha o frmOrcamento e não abre o frmCadCliente.

    segunda-feira, 31 de março de 2014 13:02
  • Raniel

    Qual é o form principal da App? É MDI? Ou quando vc fecha o form citado, ele fecha tudo e sai da App?

    segunda-feira, 31 de março de 2014 13:08
  • Raniel

    Qual é o form principal da App? É MDI? Ou quando vc fecha o form citado, ele fecha tudo e sai da App?


    Meu Form(Principal) ele não é MDI, e quando fecho as telas meu App não fecha, pois meu Form(principal) é frmPrincipal.
    segunda-feira, 31 de março de 2014 13:17
  • Então vc abre estes form no fmrPrincipal é isso ? E pq vc da um this.Close() no form principal ?
    segunda-feira, 31 de março de 2014 13:21
  • Bom, aí vc tb não tem muito controle.

    Seria interessante vc colocar o FrmPrincipal como MDI, e colocar os outros forms como filhos dele, pra aplicaçao ter um maior controle e saber que, quando fechar o FrmPrincipal, todos os outros forms devem ser fechados

    Quanto a seu erro, o código que o Daniel Brito passou deveria funcionar, pois foi exatamente o que eu testei aqui, e rodou como esperado, ele fecha a instancia do form aberto capturada pelo Application.OpenForms e abre uma nova instancia

    privatevoid button1_Click(object sender, EventArgs e)         {             Form f = Application.OpenForms["mov_visualizar"];             mov_visualizar mov = new mov_visualizar();             mov.Show();             f.Close();         }

    A diferença é que meu form chama mov_visualizar, é um form de um projeto de testes, mas o efeito é o mesmo

      
    segunda-feira, 31 de março de 2014 13:31
  • Então vc abre estes form no fmrPrincipal é isso ? E pq vc da um this.Close() no form principal ?

    Não amigo, eu não dou This.Close(), nele
    segunda-feira, 31 de março de 2014 13:49
  • Como eu faria para fechar o frmOrcamento e abrir o frmCadCliente?
    segunda-feira, 31 de março de 2014 14:05
  • Por favor, poste TODO o trecho de código que está dando problema pra vc. Pode ser que fique mais fácil analisando o seu código diretamente
    segunda-feira, 31 de março de 2014 14:11
  • Por favor, poste TODO o trecho de código que está dando problema pra vc. Pode ser que fique mais fácil analisando o seu código diretamente

    Meu código completo:

    //frmOrcamento
    
    private void txtCodCliente_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    frmCadCliente frm = new frmCadCliente();
                    frm.Show();
                }
            }
    
    
    //frmCadCliente
    
    private void dgvClientes_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                //int codigo = Convert.ToInt32(dgvCliente.Rows[e.RowIndex].Cells[0].Value);
                frmOrcamento f = Application.OpenForms["frmOrcamento"] as frmOrcamento;
    
                if (f != null)
                    f.Close();
    
                frmOrcamento fr = new frmOrcamento();
                fr.txtCodCliente.Text = "Teste";
                fr.Show();
    }

    segunda-feira, 31 de março de 2014 14:23
  • Ainda não conseguir resolver.
    segunda-feira, 31 de março de 2014 16:19
  • Olá Raniel, sugiro mais uma vez que vc tente explicar detalhadamente o que deseja, pq esse seu codigo no Up do teclado abre o formCadCliente e no double click da grid ele fecha se existir uma instancia do formOrcamento e cria outra isso é certeza que faz, caso não faça poste todo o seu codigo desde o using ate o fim pq em algum lugar vc fecha esse form.
    segunda-feira, 31 de março de 2014 16:26
  • É necessário fazer o fechamento e abertura do frmOrcamento? pq se vc vai apenas atribuir um valor que vc pegou no grid do frmCliente pra ele, pq vc não faz isso direto quando vc pega a instancia do Application.OpenForms["frmOrcamento"]?

    A não ser que vc vá fazer algum reload de dados, mas ainda assim dá pra fazer sem fechar e abrir

    segunda-feira, 31 de março de 2014 16:43
  • É necessário fazer o fechamento e abertura do frmOrcamento? pq se vc vai apenas atribuir um valor que vc pegou no grid do frmCliente pra ele, pq vc não faz isso direto quando vc pega a instancia do Application.OpenForms["frmOrcamento"]?

    A não ser que vc vá fazer algum reload de dados, mas ainda assim dá pra fazer sem fechar e abrir

    Na verdade eu quero é abrir o frmCadCliente, quando eu pressionar enter no txtCodCliente, depois disso, quando clicar duas vezes na celular do DataGridView ele jogar o valor da linha no txtCodCliente, fecha o frmCadCliente.
    segunda-feira, 31 de março de 2014 18:05
  • public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            public class Teste
            {
                public int Atributo1 { get; set; }
                public string Atributo2 { get; set; }
                public int Atributo3 { get; set; }           
    
            }
            private void Form2_Shown(object sender, EventArgs e)
            {
                List<Teste> lst = new List<Teste>();
                lst.Add(new Teste() { Atributo1 = 0, Atributo2 = "string teste", Atributo3 = 3 });
                lst.Add(new Teste() { Atributo1 = 0, Atributo2 = "string teste", Atributo3 = 3 });
                lst.Add(new Teste() { Atributo1 = 0, Atributo2 = "string teste", Atributo3 = 3 });
                lst.Add(new Teste() { Atributo1 = 0, Atributo2 = "string teste", Atributo3 = 3 });
                lst.Add(new Teste() { Atributo1 = 0, Atributo2 = "string teste", Atributo3 = 3 });
    
                grid1.AutoGenerateColumns = true;
                grid1.DataSource = lst;
            }
    
            private void grid1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                Form1 f = Application.OpenForms["Form1"] as Form1;
    
                if(f!=null)
                {
                    foreach(Control c in f.Controls)
                    {
                        if(c.GetType() == typeof(TextBox) && c.Name.Equals("txtCodCliente"))
                        {
                            c.Text = grid1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value as string;
                            this.Close(); 
    //fecha o form2, o valor volta pro txtCodCliente no //form1 (que seria o seu frmCadCliente
                        }
    
                    }
                }
            }        
        }

    Reproduzi seu cenário, tenta desse jeito, não tem muita diferença do codigo do Daniel apesar de tudo, só que eu não deixo os componentes do form como public, eles são do form e não devem ser acessados por qualquer um. Portanto, aí dentro eu pus uma maneira de vc buscar o textbox que vc quer atraves do type e do name.

    Na verdade, serve pra qualquer componente, é só vc adequar o type pro tipo que vc quer buscar

    Apenas pra te situar: Form2 = FrmOrcamento, Form1 = FrmCadCliente

    Testa aí, e retorne

    • Editado Eduardo Cury segunda-feira, 31 de março de 2014 22:24
    segunda-feira, 31 de março de 2014 22:22
  • Raniel, algum progresso?
    terça-feira, 1 de abril de 2014 19:52
  • Olá amigo ainda não tive tempo de testar,qualquer coisa posto aqui no fórum

    quarta-feira, 2 de abril de 2014 12:59
  • Gostaria de reabrir essa questão pois não consegui resolver ainda.
    quarta-feira, 4 de junho de 2014 20:28