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

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(); } } }
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
- Sugerido como Resposta welington jrModerator segunda-feira, 29 de julho de 2019 16:22
-
-
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.
-
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
-
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.
-
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
-
-
-
-
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(); }
-
-
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
-
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.
- Editado F.oliveirarocha quinta-feira, 8 de agosto de 2019 03:46 Edit
-
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
-
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.
- Editado F.oliveirarocha sexta-feira, 9 de agosto de 2019 02:56 Edit
-
-
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.
-
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
-
-
-
-
-
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:
-