Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rmlm

Mudar valor de Label a partir de outra classe

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bruno1234

É na classe RemoteRecebeNotificacoes que queres alterar o conteudo do form?

Se for podes por nessa classe uma propriedade que afectas com o form que queres alterar (ou uma interface a representar o form se quiseres abstrair).


Matraquilhos para Android.

Gratuito na Play Store.

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.