Inquiridor
Jogar valor em Form, aberto sem criar uma nova Instância.

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.
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(); }
-
-
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;
-
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();
-
-
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
-
-
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();
-
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.
-
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.
-
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.
-
-
-
-
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
-
-
-
-
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(); }
-
-
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.
-
É 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
-
É 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
-
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
-
-
-