CHAMAR FUN?ÃO DE OUTRO FORM

PERCIFILHO 09/12/2015 16:19:58
#454922
Pessoal, acho que estou fazendo alguma coisa errada (com certeza, né?).
Vou tentar explicar para ver se vocês entendem:
Tenho um formulário de movimento do caixa, mostrando num DataGridView os lançamentos da tabela.
O usuário clica no botão Novo Lançamento e abre a tela para digitar, em cima da tela do movimento;
O usuário faz o lançamento, e quando ele clica no Confirma, quero que esta tela de novo lançamento permaneça em cima da tela do movimento do caixa, porém a grid do movimento do caixa que está na tela debaixo tem que ser atualizada. é isso que eu não estou conseguindo.
No form Movimento de Caixa tem a public void MostraLancamentos que é a que mostra os lançamentos no DataGridView. (reparem que ela é public).
Estou fazendo assim: no código do botão Confirmar, depois de salvar o registro na tabela, fechar a conexão, limpar os campos, e tudo mais, eu coloquei o seguinte:

MovimentoCaixa frmMovimentoCaixa = new MovimentoCaixa();
frmMovimentoCaixa.MostraLancamentos();
LancamentoCaixa_Load(sender, e);

mas não está funcionando.
Fazia isso sem problemas no VB.Net. Estou [Ô]apanhando[Ô] pra caramba do C#, [Ô]traduzindo[Ô] um sistema inteiro.
Alguém me diz onde estou errando, por favor?

GUIMORAES 09/12/2015 16:31:59
#454924
Segue anexo exemplo.
KERPLUNK 09/12/2015 16:34:51
#454926
é um péssimo design, mas você pode criar um método estático no form que tem o grid e executá-lo sem instanciar um novo form:

public static void AtualizaGrid()
{
/// rotina para atualizar o grid
}


E então do form de lançamentos, você executa:

frmGrid.AtualizaGrid();



Estou com uma série de vídeos sobre como usar OOP que explica passo a passo como usar a OOP de verdade no seu projeto, veja o primeiro vídeo e acompanhe os outros

JABA 09/12/2015 19:09:08
#454935
Citação:

MovimentoCaixa frmMovimentoCaixa = new MovimentoCaixa();



Pelo que tô vendo, você está criando uma nova instância do formulário, e desse jeito não vai funcionar mesmo. Pra dar certo, você tem que capturar a instância do form que já está aberto (não criar uma nova, pois desse jeito você estaria trabalhando com outro form em memória) e ativar a função nessa instância.

Para fazer um teste se é isso ou não, crie uma variável que receba esse form de baixo em execução, e trabalhe em cima dela.

PERCIFILHO 10/12/2015 09:07:31
#454948
Pessoal, não consegui e como o sistema é complexo e tem muitas linhas de código, fiz um exemplo bem prático do que eu preciso e como estou fazendo.
Gostaria que algum de vocês analisasse o código e me dissesse onde estou errando para que eu possa dar andamento no projeto.
Obrigado.
XLEGENDARY 10/12/2015 09:45:58
#454949
na verdade a nova instancia de um form mudaria o seu gridview porém é muita gambiarra
como você está colocando um novo form na memória, ele recarrega os controls ( ja peguei codigo que fazia isso )e nao precisa nem chamar as funções ja que é um form novo ele acha que vc fechou e abriu o form anterior e o anterior se perde la na memoria coitado...
crie a rotina como o KERPLUNK mencionou ou/ e passe o form como parametro dentro do construtor
tem varias formas de fazer isso
FFCOUTO 10/12/2015 10:30:09
#454950
Resposta escolhida
PERCIFILHO,

Isso que você quer é até uma coisa fácil de se fazer, mas precisaria utilizar interfaces e alguns conceitos OOP já mencionados acima.
Para resolver o seu problema basta você passar a instância atual do seu form MovimentoCaixa para o outro form LancamentoCaixa.
Como fazer isso? Você tem duas possibilidades: ou passa via construtor (o mais indicado) ou passa via propriedade.

Via construtor
Mude o construtor do seu form LancamentoCaixa para:
public LancamentoCaixa(MovimentoCaixa form)
{
this.FormMovimento = form;
}


Crie uma propriedade privada para receber o parâmetro
private MovimentoCaixa FormMovimento { get; set; }


No comando para chamar o form de lançamento ficará
private void buttonLancamento_Click(object sender, EventArgs e)
{
var fLancto = new LancamentoCaixa(this); // o this é o form MovimentoCaixa
fLancto.ShowDialog();
}


No botão incluir do form LancamentoCaixa basta chamar a rotina de atualização dos lançamentos.
O mesmo se aplica para o comando alterar.
private void buttonIncluir_Click(object sender, EventArgs e)
{
// seus comandos para inclusão do lançamento

// é aqui que vai funcionar a coisa
// pois FormMovimento tem a instância do form MovimentoCaixa
FormMovimento.MostraLancamentos();
}


Via propriedade
Se você não quiser usar o construtor e sim uma propriedade, basta substituir o private para public da propriedade FormMovimento, ficando:
public MovimentoCaixa FormMovimento { get; set; }


Porém a chamada do form Lancamento vai mudar no botão Lançamento, passando para:
private void buttonLancamento_Click(object sender, EventArgs e)
{
var fLancto = new LancamentoCaixa();
fLancto.FormMovimento = this; // o this é o form MovimentoCaixa
fLancto.ShowDialog();
}


O resto é igual.

Espero ter ajudado.
PERCIFILHO 10/12/2015 10:49:31
#454951
Valeu, Fabiano, muito boa essa explicação, espero de agora em diante não ter mais problemas com isso.
Muito obrigado e até mais.
ACCIOLLY 10/12/2015 10:53:43
#454954
é meu amigo, se for do jeito que vc tá querendo, tem que ser como o KERPLUNK disse.
Agora do jeito que vc tá fazendo, pra funcionar corretamente, primeiro vc instancia o formulário de lançamento, chama ele, e fecha o form do movimento.

frm_Lancamentos lancamentos = new frm_Lancamentos();
lancamentos.Show();
this.Dispose();


e quando confirmar o lançamento você faz o inverso:

frm_Movimento movimento = new frm_Movimento();
movimento.Show();
this.Dispose();


Só complementando a OOP que o KERPLUNK tá batendo em cima disso, é que você pode usar o método construtor da classe pra passar dados como parametros pra classe do form antes que ele mesmo seja carregado. E mais! Você pode criar vários métodos construtores em uma única classe. Isso se chama sobrecarga de construtor (Pelo menos em java! kkkk). E já deu pra perceber isso logo nesse vídeo que tem no post dele. Reparou na classe DateTime que ele utilizou??? tem 12 métodos construtores. Então fique atento aos vídeos que ele posta, que logo logo ele vai te mostrar na prática como se trabalha com isso!

Té mais!
PERCIFILHO 10/12/2015 12:10:46
#454960
Valeu, também, Acciolly, mas já deu certo, fazendo do jeito que o amigo FFCouto explicou.
Quanto aos vídeos do Kerplunk, estou arrumando uma maneira de gravar os vídeos para depois ver com calma em casa.
No trabalho eu não consigo, pois na máquina em que trabalho, não existe som, e em casa estou quase sem tempo algum, trabalhando demais.
Mas com certeza vou ver todos os vídeos e aprender muito mais.
Obrigado a todos.
Tópico encerrado , respostas não são mais permitidas