none
Como passar o nome do Formulário ativo para uma variável string e utilizar num "if" RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Estou precisando saber o nome do formulário que está ativo e passar para uma variável "formularioaberto" e utilizar num "if".

    Detalhando a necessidade: Utilizo uma "TelaBancos" onde seleciono o código do banco do DataGridView para colocar num texbox, porém não gostaria de fazer uma tela para cada formulário.

    O código do banco será usado no Form de Pagamento de Títulos e também no recebimento de títulos

    Logo são dois forms diferentes com duas caixas de texto diferentes. Então necessito saber qual form está aberto para passar o código.

    Veja o código C# e me indique a propriedade ou classe para resolver este problema por favor.

    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 SGFRenaissance { public partial class TelaBancos : Form { public TelaBancos() { InitializeComponent(); } public string formularioaberto = ActiveForm.Name; // Qual a propriedade para passar o nome do Form ativo? private void Btn_Fechar_Click(object sender, EventArgs e) { this.Close(); } private void bancosBindingNavigatorSaveItem_Click(object sender, EventArgs e) { this.Validate(); this.bancosBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.bancosDGV); } private void TelaBancos_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'bancosDGV.Bancos' table. You can move, or remove it, as needed. this.bancosTableAdapter.Fill(this.bancosDGV.Bancos); } private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) { // Colocar um if e verificar qual form está ativo - são dois forms que utilizam a tela bancos. ((Pagamento_de_Titulos)Owner).banco_DebitadoTextBox1.Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString(); this.Close();

    // a caixa de texto recebe o código do banco. Está compilando e funcionando, porém só posso utilizar

    // com o Form de "Pagamento_de_Titulos"

    // ((RecebimentodeTitulos)Owner).banco_CreditadoTextBox.Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString(); // this.Close(); } } }

    domingo, 28 de julho de 2019 19:33

Todas as Respostas

  • Olá F.oliveirarocha, faça diferente.

    no construtor do form TelaBancos coloque como parâmetros o formulário e campo destino do título:

            Form f;
            TextBox t;
            public TelaBancos(Form frmDestino , TextBox TextBoxDestino)
            {
                f = frmDestino;
                t = TextBoxDestino;
                InitializeComponent();
            }
    

    Ainda no form TelaBancos, no command que confirma a seleção, você faz assim:

            private void btnConfirm_Click(object sender, EventArgs e)
            {
                f.Controls[t.Name].Text = txtTituloSelecionado.Text;
                this.Close();
            }

    Aì, nos formulários que chamam o TelaBancos, você os chama assim:

            private void btnChamaTelaBancos_Click(object sender, EventArgs e)
            {
                frmTelaBancos f = new frmTelaBancos(this, txtTitulo);
                f.ShowDialog();
             
            }


    Natan

    segunda-feira, 29 de julho de 2019 10:51
  • Natan boa noite,

    Estou fazendo o teste e  irei confirmar mais tarde se funcionou.

    Obrigado pela atenção.

    terça-feira, 30 de julho de 2019 02:20
  • Natan boa noite,

    Recebi a seguinte mensagem de erro:

    "System.NullReferenceException:Referencia de objeto não definida para uma instância de um objeto."

    Segue o código 

    Obs. a selecão é feita no DataGridView, e passo o código do Banco que é a coluna "0" (zero).

    Segue o código da nova tela com os seus códigos e a chamada nos formulários que são dois: pagamento de títulos e recebimento de títulos.

    Ao clicar no botão selecionar (do DataGridView) não passa o código e dá a mensagem de erro acima.

    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 SGFRenaissance
    {
        public partial class TelaBancosNova : Form
        {
            Form f;
            TextBox t;
            public TelaBancosNova(Form frmDestino, TextBox TextBoxDestino)
            {
                f = frmDestino;
                t = TextBoxDestino;
                InitializeComponent();
            }
    
            private void bancosBindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                this.Validate();
                this.bancosBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.bancosDGV);
    
            }
    
            private void TelaBancosNova_Load(object sender, EventArgs e)
            {
                // TODO: This line of code loads data into the 'bancosDGV.Bancos' table. You can move, or remove it, as needed.
                this.bancosTableAdapter.Fill(this.bancosDGV.Bancos);
    
            }
    
            private void btn_fechar_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
            private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if(e.ColumnIndex == 2)
                {
                    f.Controls[t.Name].Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                    this.Close();
    
                }
            }
        }
    }
    
    

    Agora segue a chamada nos formulários:

     private void btn_Bancos_Click(object sender, EventArgs e)
            {
                // TelaBancos frm = new TelaBancos() { Owner = this };
                //  frm.Show();
                TelaBancosNova f = new TelaBancosNova(this,banco_CreditadoTextBox);
                f.ShowDialog();
    
    // Obs.: esta é a chamada para o form Recebimento de Títulos

    Segunda chamada:

     private void btn_Bancos_Click_1(object sender, EventArgs e)
            {
                //   TelaBancos frm = new TelaBancos() { Owner = this };
                //   frm.Show();
                TelaBancosNova f = new TelaBancosNova(this, banco_DebitadoTextBox1);
                f.ShowDialog();
    
            }
    
    // Form Pagamento de Títulos

    Veja a imagem do Form Bancos:

    Muito obrigado pela atenção:

    Me ajude nessa, estou aprendendo. Será mais um aprendizado.

    Abraços.

    terça-feira, 30 de julho de 2019 03:33
  • F.oliveirarocha

    Em qual linha está retornando erro?

    A nível de checagem, jogue o valor do item selecionado para uma variável e depois atribua-o ao form destino.


    Natan

    terça-feira, 30 de julho de 2019 10:42
  • Natan boa noite,

    Vamos lá, respondendo a sua pergunta. 

    A linha de erro é a 49

    Atribuí uma variável e o erro persiste. O Erro ocorre na TelaBancosNova.

    Chequei no debug e o nomo do formulário destino no "f" está vindo correto e o textbox de destino "t.Name" também.

    Alguma outra sugestão?

    Segue o código:

     private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if(e.ColumnIndex == 2)
                {
                    var codigo = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                    f.Controls[t.Name].Text = codigo;
                    this.Close();
    
                }
            }
    Abraços e obrigado pela atenção.

    terça-feira, 30 de julho de 2019 23:09
  • F.oliveira

    Tente assim:

                private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
                {
                    if (e.ColumnIndex == 2 && bancosDataGridView.Rows[e.RowIndex].Cells[0].Value != null)
                    {
                        f.Controls[t.Name].Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                        this.Close();
    
                    }
                }


    Natan

    quarta-feira, 31 de julho de 2019 11:30
  • Natan boa noite,

    Não funcionou, recebi a mesma mensagem. 

    "System.NullReferenceException:Referencia de objeto não definida para uma instância de um objeto."

    Att.

    Flávio 

    sexta-feira, 2 de agosto de 2019 01:42
  • poste um print que dê pra ver o código e o erro.

    Natan

    sexta-feira, 2 de agosto de 2019 10:25
  • Ok Natan,

    Vou fazer de segunda feira em diante.

    Vamos tentar. Não tem código, somente aquela mensagem que enviei acima.

    Tirei o if, e continua dando a mesma mensagem.

    Abraços.

    sábado, 3 de agosto de 2019 16:20
  • Natan boa noite,

    Desculpe me pelo atraso. 

    vou postar o código novamente e o print. 

    Fiz um novo formulário. O Erro persiste. Veja se vc mata a charada.

    Abraços e obrigado pela atenção.

     Form Bancos novo:
    
     public partial class FormEscolherBanco : Form
        {
            Form f;
            TextBox t;
    
            public FormEscolherBanco(Form frmDestino, TextBox TextBoxDestino)
            {
                f = frmDestino;
                t = TextBoxDestino;
                InitializeComponent();
            }
    
            private void btn_fechar_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
           
    
            private void FormEscolherBanco_Load(object sender, EventArgs e)
            {
                // TODO: This line of code loads data into the 'bancosDGV.Bancos' table. You can move, or remove it, as needed.
                this.bancosTableAdapter.Fill(this.bancosDGV.Bancos);
    
            }
    
            private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                f.Controls[t.Name].Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                this.Close();
            }
        }
    
    Na Chamada do Form Bancos. No pagamento de Títulos:
    
      private void btn_Bancos_Click_1(object sender, EventArgs e)
            {
             //    TelaBancos frm = new TelaBancos() { Owner = this };
             //  frm.Show();
              FormEscolherBanco f = new FormEscolherBanco (this, banco_DebitadoTextBox1);
              f.ShowDialog();
    
            }
    

    quarta-feira, 7 de agosto de 2019 03:25
  • Natan,

    Veja a mensagem de Erro na Foto. Tive que reduzir devido a resolução dar uma imagem com tamanho maior que o permitido.

    Não sei onde está "titulo" ???

    Obrigado pela ajuda.

    quarta-feira, 7 de agosto de 2019 04:11
  • F.oliveirarocha

    quando eu simulei, em alguns momentos o trecho abaixo gerava erro de null pois em alguns momentos essa célula realmente estava vazia, por isso que eu te sugeri checar esse valor antes de converter para string e enviar como resposta para o formulário.

    bancosDataGridView.Rows[e.RowIndex].Cells[0].Value

    inclua novamente o trecho abaixo e teste, envie um novo print com o erro.

                private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
                {
                    if (e.ColumnIndex == 2 && bancosDataGridView.Rows[e.RowIndex].Cells[0].Value != null)
                    {
                        f.Controls[t.Name].Text = bancosDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                        this.Close();
    
                    }
                }
    tente identificar quem está com valor null.


    Natan

    quarta-feira, 7 de agosto de 2019 10:59
  • Natan boa noite,

    Identificado, "f" está nulo.

    Coloquei o Debug e o Grid está ok, passando o valor para a variável.

    Porém f está nulo e t tbm está nulo.

    Não teria que dizer alguma informação nos Formulários Destino com o "f" - vc já colocou, mas será que está ligando os dois? 

    "f" não está recebendo "valor" nenhum e "t" tbm, por isso não passa o código para o textbox do FormDestino.

    Veja se consegue resolver agora.

    Abraços.

     private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex == 2 && bancosDataGridView.Rows[e.RowIndex].Cells[0].Value != null)
                {
                    string Codigo = bancosDataGridView.Rows[e.RowIndex].Cells["Cod_Banco"].Value.ToString();
                    f.Controls[t.Name].Text = Codigo;
                    this.Close();
                }
               
            }

    Segue a imagem.



    quinta-feira, 8 de agosto de 2019 03:38
  • Beleza, agora a coisa ficou clara.

    você precisa ter as variáveis f e t declaradas e dentro do construtor atribuir os valores recebidos a elas.

    Form f; TextBox t;

    public TelaBancosNova(Form frmDestino, TextBox TextBoxDestino) { f = frmDestino; t = TextBoxDestino; InitializeComponent(); }

    Verifique se o form que está chamando a TelaBancosNova está enviando os parâmetros corretos.


    Natan

    • Editado 'Natan Silva quinta-feira, 8 de agosto de 2019 10:49
    quinta-feira, 8 de agosto de 2019 10:47
  • Boa noite Natan,

    Ok, fiz isso no construtor, os parâmetros estão sendo  passados, porém o Erro continua.

    Agora sem "f" was null

    Apenas a mensagem de null reference. 

    E agora ? Não estou acreditando.

    Abraços e obrigado pela atenção.


    sexta-feira, 9 de agosto de 2019 02:55

  • poste a classe completa do TelaBancosNova e a chamada dele no form destino.


    Natan

    sexta-feira, 9 de agosto de 2019 10:21
  • Bom dia Natan, 

    Desculpe-me pelo atraso. Não liguei o computador neste fim de semana.

    Segue o post.

    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 SGFRenaissance
    {
       
    
        public partial class FormEscolherBanco : Form
        {
            Form f;
            TextBox t;
    
            public FormEscolherBanco(Form frmDestino, TextBox TextBoxDestino)
            {
               f = frmDestino;
               t = TextBoxDestino;
        
                InitializeComponent();
            }
    
            private void btn_fechar_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
           
    
            private void FormEscolherBanco_Load(object sender, EventArgs e)
            {
                // TODO: This line of code loads data into the 'bancosDGV.Bancos' table. You can move, or remove it, as needed.
                this.bancosTableAdapter.Fill(this.bancosDGV.Bancos);
    
            }
    
            private void bancosDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex == 2 && bancosDataGridView.Rows[e.RowIndex].Cells[0].Value != null)
                {
                    string Codigo = bancosDataGridView.Rows[e.RowIndex].Cells["Cod_Banco"].Value.ToString();
                    f.Controls[t.Name].Text = Codigo;
                    this.Close();
                }
               
            }
        }
    }
    

    Agora a chamada no Formulário

       private void btn_Bancos_Click_1(object sender, EventArgs e)
            {
             //  TelaBancos frm = new TelaBancos() { Owner = this };
             //  frm.Show();
              FormEscolherBanco f = new FormEscolherBanco (this, banco_DebitadoTextBox1);
              f.ShowDialog();
    
            }
    Abraços e obrigado pela atenção.

    segunda-feira, 12 de agosto de 2019 12:58
  • Beleza

    agora coloque um break point em InitializeComponent.

            public FormEscolherBanco(Form frmDestino, TextBox TextBoxDestino)
            {
               f = frmDestino;
               t = TextBoxDestino;
        
                InitializeComponent();
            }
    quando chegar nesse trecho, identifique se f e t receberam os objetos corretos.


    Natan

    segunda-feira, 12 de agosto de 2019 13:56
  • Natan boa tarde,

    Coloquei o break point,

    f recebeu o nome correto.

    t está nulo. 

    terça-feira, 13 de agosto de 2019 15:57
  • Você possui o controle banco_DebitadoTextBox1 com esse nome no formulário destino?

    Natan

    terça-feira, 13 de agosto de 2019 16:00
  • Natan boa noite,

    Desculpe-me pelo atraso.

    Sim, possuo "banco_DebitadoTextBox1" copiado do formulário.

    O que fazemos agora?

    abcs.

    quinta-feira, 15 de agosto de 2019 01:43
  • Cara, não tem lógica, se o form destino está chamando o construtor correto, enviando os parâmetros corretos então ele deveria estar recebendo o valor correto.

    Precisa debugar desde a chamada e ir acompanhando se os valores enviados.


    Natan

    quinta-feira, 15 de agosto de 2019 10:41
  • Boa tarde, Amigos!

    Alguém poderia me dar um ajuda em uma questão publicada a alguns dias, segue o link.

    Titulo da threads:

    Como gerar auto numeração no datagrid em wpf quando adicionar um novo registro

    O link da threads: 

    https://social.msdn.microsoft.com/Forums/pt-BR/d8664e36-edff-4565-99e0-0c433de1a5f3/como-gerar-auto-numerao-no-datagrid-em-wpf-quando-adicionar-um-novo-registro?forum=vscsharppt#6976cd0b-0e48-40cf-90dc-275979f98925

     
    quinta-feira, 15 de agosto de 2019 17:15
  • Natan bom dia, 

    Vou verificar e lhe informo.

    Vou debugar desde o início e tentar resolver.

    Abçs e obrigado pela atenção.

    sexta-feira, 16 de agosto de 2019 13:56