Accedere ai controlli del form di avvio

giovedì 07 febbraio 2008 - 16.56

bluland Profilo | Guru

Salve,

Come da oggetto,

es.

ho form1, form2

voglio accedere ad una label su form1 da form2
ho sempre fatto cosi:

form1.label etc..

ora se il form1 è il form di avvio non funziona!

perche?

saluti
--------------------
Vincenzo PESANTE
System Engineer

aiedail92 Profilo | Expert

Ciao

Non funziona perchè il form d'avvio non viene dichiarato come campo: se guardi nella classe Program (il file program.cs), nella static void main c'è un'istruzione

Application.Run(new Form1());

Ti propongo diverse soluzioni, poi vedi tu quale è quella che più ti piace :

1) Dichiarare un campo statico globale di tipo Form1, inizializzarlo nella void main e da lì lanciarlo. Quindi per accedere da form2 usi il campo:

static class Program { static Form1 mainForm; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); mainForm = new Form1(); Application.Run(mainForm); } }

2) Incapsulare nella Form2 una proprietà SenderForm di tipo Form che imposti quando chiami il form2 da form1. Eseguendo il cast su Form1 puoi ottenere ed impostare i controlli del form chiamante.

3) Fare un ciclo su Application.OpenForms, verificare quale sia il form di cui hai bisogno, e quindi impostare i controlli.

4) Aggiungere un evento nel form2 che viene generato quando devi cambiare dei controlli di Form1. Sottoscrivi questo evento da form1, (nel quale hai dichiarato un'istanza di Form2), e quando l'evento viene generato, passando gli opportuni parametri, imposti i controlli come ti servono. Ti scrivo un esempio:

namespace TuoNamespace { //Il metodo di gestione dell'evento ChangeRequested //Naturalmente puoi adattarlo come ti serve meglio public delegate void ChangeRequestedEventHandler(string nome, string nuovoValore); public class Form2 : Form { ... //L'evento che viene generato quando devi fare un cambiamento public event ChangeRequestedEventHandler ChangeRequested; //Quando fai click su un bottone chiedi a form1 di cambiare //il testo della label1 private void button_Click(object sender, EventArgs e) { if (ChangeRequested != null) { //Invochi l'evento ChangeRequested("Label1", "Testo cambiato tramite evento"); } } } public class Form1 : Form { ... Form2 fm2; public Form1() { InitializeComponent(); //Sottoscrivo l'evento fm2.ChangeRequested += new ChangeRequestedEventHandler(fm2_ChangeRequested); } void fm2_ChangeRequested(string nome, string nuovoValore) { //Controllo quale sia il controllo da modificare foreach (Control c in this.Controls) { if (c.Name == nome) { //Modifico il valore this.label1.Text = nuovoValore; } } } } }

Luca

alextyx Profilo | Expert

In che linguaggio ti serve?
Se è VB.net, dai un'occhiata qui:
http://forum.masterdrive.it/articoli-visual-basic-net-36/accedere-controlli-form-form-diverso-17291/

bluland Profilo | Guru

Grazie delle risposte,

il metodo che ho illustrato funziona,

solo che il form di avvio l'avevo chiamato Menu lo stesso nome di un metodo della classe Form, per cui per far funzionare ho semplicemente rinominato il form in Menu1.


Ciao e grazie a tutti
--------------------
Vincenzo PESANTE
System Engineer

alextyx Profilo | Expert

Sì, da VB2005 in poi funziona, grazie all'istanza di default che viene creata per i form.
In generale, valgono i normali criteri di visibilità delle classi.

bluland Profilo | Guru

Infatti abituato con Vb non ho notato questa cosa.

--------------------
Vincenzo PESANTE
System Engineer
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5