CHAMAR FUN?ÃO DE OUTRO FORM
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:
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?
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?
Segue anexo exemplo.
é 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:
E então do form de lançamentos, você executa:
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
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
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.
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.
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.
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
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
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:
Crie uma propriedade privada para receber o parâmetro
No comando para chamar o form de lançamento ficará
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.
Via propriedade
Se você não quiser usar o construtor e sim uma propriedade, basta substituir o private para public da propriedade FormMovimento, ficando:
Porém a chamada do form Lancamento vai mudar no botão Lançamento, passando para:
O resto é igual.
Espero ter ajudado.
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.
Valeu, Fabiano, muito boa essa explicação, espero de agora em diante não ter mais problemas com isso.
Muito obrigado e até mais.
Muito obrigado e até mais.
é 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.
e quando confirmar o lançamento você faz o inverso:
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!
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!
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.
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