2013-02-02 15 views
5

Sto cercando di capire qual è la differenza tra proprietà statiche e proprietà pubbliche. Ma quando ho provato ad accedere alla mia proprietà pubblica "Test" in altro formato, dice "null".C# winform: accesso alle proprietà pubbliche da altre forme e differenze tra proprietà statiche e pubbliche

Heres Form1:

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

    private string _test; 

    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     _test = "This is a test"; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Show(); 
    } 
} 

Ecco Form2:

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

    private void Form2_Load(object sender, EventArgs e) 
    { 
     Form1 frm1 = new Form1(); 
     label1.Text = frm1.Test; 
    } 
} 

per controllare il valore di 'Test' in Form1, ho messo un punto di interruzione a questa linea:

label1.Text = frm1.Test; 

Ma il valore è 'null'.

Please help me come posso accedere alle proprietà pubbliche ad altre forme.

E BTW ho cercato di rendere questa proprietà pubblica "statica". Posso accedere a questo usando questo:

Form1.Test 

ma ho notato che posso cambiare il valore 'Test' da Form2, che io non voglio che accada. Ecco perché sto cercando di usare la proprietà pubblica ma senza fortuna. Qualcuno può chiarirmi queste cose. Grazie per tutto il tuo aiuto ragazzi!

EDIT: (For follow up question) 

La risposta di Sir John Koerner è la migliore risposta per la mia domanda. Ma ho una domanda di follow-up, ho provato a rendere queste proprietà 'test' come 'statiche', e ho notato che anche se faccio di questa proprietà una proprietà statica o pubblica, può comunque essere modificata in Form2. Per farmi capire, ecco un esempio:

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     f1.Test = "This test has been changed!"; 

     this.Close(); 
    } 
} 

Dopo Form2 chiuso, ho cercato di rompere di nuovo in Form1_Load per controllare il valore di 'Test', ed è stato cambiato! Come posso rendere una proprietà pubblica in Form1 da leggere solo in Form2 e non può essere editato? Per favore, chiariscimi. Grazie mille ragazzi!

risposta

6

La proprietà è una variabile di istanza, pertanto il valore può essere diverso tra le diverse istanze di Form1.

Se si sta tentando di accedere a variabili di istanza da un modulo padre, il modo più semplice per farlo è passare Form1 al costruttore di Form2.

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 
} 

Poi, quando si crea un nuovo Form2 da Form1, si può fare questo:

Form2 frm2 = new Form2(this); 

Se volete che il vostro proprietà da sola lettura, è possibile semplicemente non specificare un setter:

public string Test 
{ 
    get { return _test; } 
} 
+0

Grazie per questo uomo, vedi la mia modifica per la mia domanda di follow-up, spero di aver chiarito la mia domanda. – jomsk1e

+0

@ JRC vedi la mia modifica. –

+0

questo è tutto! grazie per il tuo aiuto Giovanni! Bella lezione da parte tua! Scusa per essere un principiante :( – jomsk1e

0

Il frm1 non è l'oggetto del modulo principale. È un oggetto appena creato dove la proprietà Test si inizializza quando carica (nel gestore di eventi Form1_Load).

0

La prima istanza di Form1 mostra un esempio di Form2, e quindi Form2 crea un'altra istanza di Form1.Questo potrebbe funzionare, ma si imposta _test nel caso Form.Load, che:

si verifica prima che un modulo viene visualizzato per la prima volta.

non si presenta l'istanza di Form1 si sta cercando di leggere da Test, quindi la sua manifestazione Load non si verificherà e Test rimane null.

È possibile aggiungere un sovraccarico del costruttore o una proprietà per passare il riferimento Form1 come menzioni @JohnKoerner, ma preferirei solo passare la variabile richiesta, forse anche incapsulata in un evento, per ridurre l'accoppiamento. Form2 di solito non ha bisogno di sapere tutto su Form1.

-1

pubblico

Il tipo o membro può accedere da qualsiasi altro codice nello stesso assembly o altro assembly che fa riferimento a esso.

statico

Il modificatore statico su una classe significa che la classe non può essere istanziata, e che tutti i suoi componenti sono statici. Un membro statico ha una versione indipendentemente dal numero di istanze del suo tipo di chiusura.

Una classe statica è fondamentalmente la stessa di una classe non statica, ma c'è una differenza: una classe statica non può essere istanziata esternamente. In altre parole, non è possibile utilizzare la nuova parola chiave per creare una variabile del tipo di classe. Poiché non esiste una variabile di istanza, puoi accedere ai membri di una classe statica utilizzando il nome della classe stessa.

Tuttavia, c'è una cosa come un costruttore statico. Qualsiasi classe può avere una di queste, incluse le classi statiche. Non possono essere chiamati direttamente & non possono avere parametri (diversi da qualsiasi parametro di tipo sulla classe stessa). Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima che venga creata la prima istanza o qualsiasi riferimento a membri statici. Sembra che questo:

classe statica Foo() { statica Foo() { Bar = "Fubar"; }

public static string Bar { get; set; } 

}

classi statiche sono spesso utilizzati come servizi, è possibile utilizzare in questo modo:

MyStaticClass.ServiceMethod (...);

1

L'utilizzo di questo metodo di 'static'

Alla prima etichetta di controllo modificatori di proprietà = Public

nel Codice di programma di seguito

public static Form1 frm1 = new Form1(); 
public static Form2 frm2 = new Form2(); 

nel codice Form1 sotto

Program.frm2.show(); 

in Codice Form2 sotto

label1.Text=Program.frm1.text; 
Problemi correlati