Usuário com melhor resposta
classes acessando labels / text do Form

Pergunta
-
amigos
tenho um programa em C# dividido em várias classes, algumas precisariam acessar texto e labels do form vísivel, como faço isto !!!???
uma parte de meu código:RxParse ve = new RxParse(); string resulta = ve.Analiza_Recebido(s); if (resulta != null) ve.Processa_Str_Recebida(s, resulta);
Processa_Str_Recebida precisa escrever no form mas, claro que deve ter um ótimo motivo, não acessa ele.
obrigado
Respostas
-
Você não instanciou a classe Main, apenas criou uma variavel.
Como, disse você precisa de uma instancia da classe Main para poder modificar seus valores na classe Form1.
Veja, não basta você fazer:
Main main = new Main(); main.Campo ="afdafa";
Pois neste caso você criaria uma NOVA instancia, e não usaria a instancia já criada.
Você deve receber a instancia de Main no construtor da classe Form1:
public partial class Form1 : Form { Main main; public Form1(Main objeto) { main = objeto; } public void button1_Click(object sender, EventArgs e) { main.Campo.Text = "mudei o texto pela classe =)"; } }
Take a look at WPF FlashMessage
- Sugerido como Resposta Jean Menezes terça-feira, 29 de maio de 2012 14:26
- Marcado como Resposta Levi DomingosModerator terça-feira, 29 de maio de 2012 22:48
Todas as Respostas
-
Boa noite,
Marcelo, se eu entendi bem acho que você pode criar atributos ReadOnly de seus objetos de tela.
Vou te mostrar um atributo e você pode aplicar para os demais que precisar.
//Coloque esse no código do form public string LabelTextValue { get { return Label1.text; } }
Lógico que a classe que precisa acessar essas informações tem que receber qual o form que esta visivel. Acho que você passa isso por parâmetro.
Fábio Kiatkowski Engenheiro de Software
-
mas será que não terá uma maneira menos trabalhosa ?
em VB, de outro formulario, eu simplesmente fazia Form1.Label1.text = "Qualquer Coisa" ...
valeu,
marcelo
------------------------------------------ "Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem..."
-
Na verdade o que preciso saber é como uma classe consegue alterar labels do Form, ou sendo por exemplo, o Form1 tenha seus labels alterados por outra clase por exemplo a: RXParse
obrigado------------------------------------------ "Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem..."
-
Oi Marcelo,
Pra que uma classe específica(que não seja seu formulário) altere os dados das Labels do seu formulário você pode passar por parâmetro para a classe responsável, o que não é uma boa prática.
Acho que o que precisa seria mais interessante criar um método no seu formulário e alterar tudo por lá. Provavelmente o source deve vir de uma base de dados, ai uma classe seria responsável por recuperar essas informações.
Abraço.
-
O Form é uma classe, e instanciado vira um objeto.
Qualquer objeto para modificar outro, precisa de uma instancia daquela classe.
O que eu quis dizer é que como o Form é uma classe, você precisa de um objeto dela para fazer qualquer modificação, então se um método ou outra classe vai modificar algum valor do Form, é necessário que esse método/classe receba uma instancia do Form.
Take a look at WPF FlashMessage
-
Oi Marcelo,
Pra que uma classe específica(que não seja seu formulário) altere os dados das Labels do seu formulário você pode passar por parâmetro para a classe responsável, o que não é uma boa prática.
Acho que o que precisa seria mais interessante criar um método no seu formulário e alterar tudo por lá. Provavelmente o source deve vir de uma base de dados, ai uma classe seria responsável por recuperar essas informações.
Abraço.
Olá Valdair
Obrigado pela resposta, era o que eu temia: ter que ficar monitorando uma alteração pra atualizar o label, na verdade coloquei uma mas são várias e texto também.
Ou mudar o que estava separado em classes colocar num único "Formizão" (pois o Form visível ficará enorme em código)
Se me permite o desabafo, estou sentindo que estou tendo mais trabalho em C# pra fazer a mesma coisa que fazia em VB
abraço e obrigado
Marcelo
------------------------------------------ "Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem..."
-
-
Vai nas propriedades do Label que você quer modificar e procura a propriedade Modifiers e muda de Private para Public que você vai conseguir acessar esse Label por uma classe.
Jean
Eu já havia tentando fazer isto mas não consegui, também não tenho certeza se usei acesso da forma correta aí acabei desistindo.
Desculpe não queria pedir muito mas, teria como postar como acesso da outra classe? vou correndo atras e ver se acho algo também.
obrigado, abraço
marcelo
------------------------------------------ "Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem..."
-
Não sei se eu entendi, vamos lá.
Você tem a sua classe +- como a de baixo, onde vc tem a sua propriedade e um método MostrarStatus, onde vc executa seu código e da uma mensagem final.
public class MinhaClasse { private string status; public string Status { get { return status; } set { status = value; } } public void MostrarStatus() { //O que eu quero executar //Mensagem de sucesso após a execução acima status = "Você pode TUDO!"; } }
No seu formulário, vamos dizer que vc tem um button e quando clicar neste button vc quer que o status de sucesso do seu método apareça na sua label. Ficaria +- como abaixo:
private void btnStatus_Click(object sender, EventArgs e) { MinhaClasse classe = new MinhaClasse(); //chamando a minha classe classe.MostrarStatus(); //chamando o método lblStatus.Text = classe.Status; //passando o status que eu defini no meu método que esta na minha classe para minha Label }
Caso nao seja isso, me desculpe....porém me avise !!
Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.
-
public partial class Form1 : Form { Main main; public Form1(Main objeto) { main = objeto; } public void button1_Click(object sender, EventArgs e) { main.Campo.Text = "mudei o texto pela classe =)"; } }
Vê ai se dá para entender
Com o edit sugerido pelo Joba
- Sugerido como Resposta Jean Menezes terça-feira, 29 de maio de 2012 14:26
- Editado Jean Menezes terça-feira, 29 de maio de 2012 14:27 Estava errado
-
Você não instanciou a classe Main, apenas criou uma variavel.
Como, disse você precisa de uma instancia da classe Main para poder modificar seus valores na classe Form1.
Veja, não basta você fazer:
Main main = new Main(); main.Campo ="afdafa";
Pois neste caso você criaria uma NOVA instancia, e não usaria a instancia já criada.
Você deve receber a instancia de Main no construtor da classe Form1:
public partial class Form1 : Form { Main main; public Form1(Main objeto) { main = objeto; } public void button1_Click(object sender, EventArgs e) { main.Campo.Text = "mudei o texto pela classe =)"; } }
Take a look at WPF FlashMessage
- Sugerido como Resposta Jean Menezes terça-feira, 29 de maio de 2012 14:26
- Marcado como Resposta Levi DomingosModerator terça-feira, 29 de maio de 2012 22:48
-
-
Você não instanciou a classe Main, apenas criou uma variavel.
Como, disse você precisa de uma instancia da classe Main para poder modificar seus valores na classe Form1.
Veja, não basta você fazer:
Main main = new Main(); main.Campo ="afdafa";
Pois neste caso você criaria uma NOVA instancia, e não usaria a instancia já criada.
Você deve receber a instancia de Main no construtor da classe Form1:
public partial class Form1 : Form { Main main; public Form1(Main objeto) { main = objeto; } public void button1_Click(object sender, EventArgs e) { main.Campo.Text = "mudei o texto pela classe =)"; } }
Take a look at WPF FlashMessage
Pra dar um retorno
Na verdade não consegui instanciar minha classe Form1 existente dentro da classe que analiza as strings entrantes...mas ok
O que acabei fazer foi trocar variáveis globais entre elas e com uma Flag que avisa quando teve alterações/ chegada de nova string
------------------------------------------ "Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem..."
-
Bom eu resolvi assim:
A Classe que inicia o meu programa está dessa maneira..namespace blablabla { static class Program { public static int _intGlobal{ set; get; } // um exeplo de int global public static frmPrincipal _frmPrincipal = new frmPrincipal(); // aqui esta o formulario que quero acessar os controles static void Main() { Application.EnableVisualStyles(); Application.Run(_frmPrincipal); } } }
sendo assim, sempre que quiser acessar algum controle do meu formulario (lembrando que precisa setar o MODIFIERS do controle para PUBLIC) basta eu usar o seguinte código
Program._frmPrincipal.nomedealgumlabel.Text = "algum texto";
por aqui funcionou normalmente!
Abraço!