Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
rmlm

Mudar valor de Label a partir de outra classe

Recommended Posts

rmlm

Boa noite...

Estou com um problema dos grandes (pelo menos para mim)

Eu tenho uma classe remota que é chamada, e esta tem que mudar um texto da label.

O problema é que nao consigo aceder á label...

Ja tentei criar um método estático:

public static void sendText(string msg)
{
      label1.Text = msg
}

Depois era só chamar Form1.sendText("blabla"); mas esta solução não funciona porque a label não e estatica

Existe alguma maneira de por a label static?

Tambem não posso fazer isto:

     Form1 frm = new Form1();

Porque depois ia-me criar uma nova janela e não iria modificar a que está aberta...

Conclusão não sei mesmo como modificar uma label ou textbox a partir de outra classe

Soluções?

Cumps

Share this post


Link to post
Share on other sites
bruno1234

Isso depende de como tens a tua aplicação organizada.

Para alterares o texto da label, podes expor uma propriedade no teu form que faça isso.

Depois tens que arranjar forma do teu form ser passado para a outra classe. Existem várias maneiras de fazer isso, a melhor para o teu caso depende do resto da aplicação.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Share this post


Link to post
Share on other sites
rmlm

Existem várias maneiras de fazer isso, a melhor para o teu caso depende do resto da aplicação.

Como por exemplo?

Share this post


Link to post
Share on other sites
rmlm

Eu vou tentar mais ao menos como é a minha aplicação:

Eu estou a fazer um messenger.

Quando mando uma mensagem acontece isto:

1º Cliente pede ao servidor que quer mandar uma msg para user X

2º Servidor consulta IP e porta do user X

3º Servidor chama metodo remoto disponivel no user X (Aqui esta o metodo que devia escrever na TextBox)

Eu ja testei isto com uma MessageBox e a mensagem chega ao user X sem problemas.

Posso ficar com um Messenge á base de popups  ;)

Agora falando a sério não sei mesmo como fazer isto...

O objecto remoto é colocado á disposição assim:

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteRecebeNotificacoes), "recebe_notifica", WellKnownObjectMode.Singleton);

Por isso é impossível meter construtores...

Share this post


Link to post
Share on other sites
hipeironsix

Boas,

Basicamente tu precisas de um delegate ou uma interface, mas neste caso faz mais sentido um delegate.

Um delegate permite guardar a referencia de uma instancia e um metodo, funcionam quase como um ponteiro para funções.

Vou deixar aqui um exemplo depois adapta ao que precisas.

Neste exemplo estão duas classes, a primeira contem uma lista e um botao que abre o form para adicionar novos elementos.

Nesse form existe um campo de texto e um botao que adiciona elementos a lista. 


/*********** Primeiro Form ***************/

    //criaçao do delegate
    public delegate void NovoDelegate(string item);

    public partial class Lista : Form
    {
        public Lista()
        {
            InitializeComponent();
        }

        //evento que abre o form para adicionar um novo elemento
        private void button1_Click(object sender, EventArgs e)
        { 
            NovoElemento frm = new NovoElemento();

            //faz referencia ao metodo utilizado pela classe NovoElemento para adicionar items 
            frm.RefAdicionaItems = new NovoDelegate(this.AdicionaItems);  
            frm.ShowDialog();
        }

        //metodo que adiciona os items 
        private void AdicionaItems(string item)
        {
            listBox1.Items.Add(item);        
        }
    }

/*********** SegundoForm ***************/

    public partial class NovoElemento : Form
    {  
        
        public NovoDelegate RefAdicionaItems;

        public NovoElemento()
        {
            InitializeComponent();   
        }

        private void button1_Click(object sender, EventArgs e)
        {
             RefAdicionaItems(textBox1.Text);
        }

    }

Espero que ajude mas de qualquer forma devias ler a informação que a Microsoft tem sobre este assunto.

http://msdn.microsoft.com/en-us/library/aa288459%28v=VS.71%29.aspx

Share this post


Link to post
Share on other sites
rmlm

Ola hipeironsix, antes demais obrigado pela resposta!

Tentei com base na tua solução isto:

Coloquei uma pequna função no meu formulario que adiciona texto ao meu TextBox:

        public void SetText(string msg)
        {
            MessageBox.Show("Cheguei dentro do form");
            tb_exemplo.AppendText(msg + "\n");
        }

Depois na classe que vai mandar escrever fiz:

        private delegate void NovoDelegate(string msg);
        Principal frm;

        public void Recebe(string txt)
        {
            MessageBox.Show("Cheguei ao cliente!");

            NovoDelegate nd = new NovoDelegate(frm.SetText);
            nd(txt);
        }

Nenhum erro aconteceu, mas o text também não chegou ao Form

Nota: A minha aplicação é WPF

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.