2013-02-02 10 views
5

Próbuję zrozumieć, jaka jest różnica pomiędzy właściwościami statycznymi i publicznymi. Ale kiedy próbowałem uzyskać dostęp do mojej publicznej własności "Test" w innej formie, było napisane "null".C# winform: uzyskiwanie dostępu do właściwości publicznych z innych formularzy i różnica między właściwościami statycznymi i publicznymi

Herezje 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(); 
    } 
} 

Oto 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; 
    } 
} 

Aby sprawdzić wartość 'test' w Form1, umieścić punkt przerwania na tej linii:

label1.Text = frm1.Test; 

Ale wartość jest "zerowa".

Proszę mi pomóc, jak mogę uzyskać dostęp do właściwości publicznych do innych formularzy.

I BTW Próbowałem uczynić tę publiczną własność "publicznym statycznym". można uzyskać dostęp za pomocą tego:

Form1.Test 

Ale zauważyłem, że mogę zmienić wartość „test” z Form2 których nie ma się wydarzyć. Dlatego próbuję korzystać z własności publicznej, ale bez powodzenia. Czy ktoś może mi wyjaśnić te rzeczy. Dzięki za twoją pomoc faceci!

EDIT: (For follow up question) 

Odpowiedź Sir Johna Koernera jest najlepszą odpowiedzią na moje pytanie. Ale mam pytanie uzupełniające, starałem się, aby te właściwości "testu" były "statyczne", i zauważyłem, że nawet jeśli uczynię tę właściwość statyczną lub publiczną, nadal można ją edytować w Form2. Aby się jasno oto próbka:

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(); 
    } 
} 

Po Form2 zamknięte, próbowałem ponownie włamać Form1_Load sprawdzić wartość „test”, i to zmieniło! Jak utworzyć właściwość publiczną w formularzu Form1, aby odczytać tylko w formularzu 2 i nie można jej edytować? Proszę, wyjaśnij mi. Wielkie dzięki!

Odpowiedz

6

Twoja własność jest zmienną instancji, więc wartość może być różna dla różnych instancji Form1.

Jeśli próbujesz uzyskać dostęp do zmiennych instancji z formularza nadrzędnego, najprostszym sposobem jest przekazanie formularza Form1 do konstruktora formularza 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; 
    } 
} 

Następnie podczas tworzenia nowego Form2 z Form1, można to zrobić:

Form2 frm2 = new Form2(this); 

Jeśli chcesz, aby Twoje mieszkanie jest tylko do odczytu, po prostu nie można określić setter:

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

Dzięki za tego człowieka, zobacz moją poprawkę na moje następne pytanie, mam nadzieję, że zadałem mi jednoznaczne pytanie. – jomsk1e

+0

@JRC zobacz moją edycję. –

+0

to wszystko! dzięki za twoją pomoc John! Dobra lekcja od ciebie! Przepraszamy za bycie nowicjuszem :( – jomsk1e

0

The frm1 nie jest głównym obiektem formularza. Jest to nowo utworzony obiekt, w którym inicjuje się właściwość Test podczas ładowania (w module obsługi zdarzeń Form1_Load).

0

Pierwszy przypadek Form1 przedstawia przypadek Form2, a następnie Form2 tworzy inny wystąpienie Form1.To może działać, ale można ustawić _test w przypadku Form.Load, które:

wystąpi zanim zostanie wyświetlony formularz po raz pierwszy.

Nie pokazują wystąpienie Form1 próbujesz przeczytać Test z, więc jego Load zdarzenie nie nastąpi i Test pozostaje null.

Można dodać przeciążenie konstruktora lub właściwość do przekazania referencji Form1, o której wspomina @JohnKoerner, ale wolałbym tylko przekazać wymaganą zmienną, być może nawet zamkniętą w zdarzeniu, w celu zmniejszenia sprzężenia. Form2 zwykle nie musi wiedzieć wszystkiego o Form1.

-1

publicznego

typu lub członek mogą być dostępne przez jakikolwiek inny kod w tym samym zespole lub innego zespołu, która odwołuje go.

statyczny

Statyczny modyfikator w klasie oznacza, że ​​klasa nie może być instancja, i że wszyscy jej członkowie są statyczne. Statyczny element członkowski ma jedną wersję niezależnie od tego, ile instancji typu otaczającego jest tworzonych.

Klasa statyczna jest zasadniczo taka sama, jak klasa niestatyczna, ale jest jedna różnica: klasa statyczna nie może być tworzona zewnętrznie. Innymi słowy, nie możesz użyć nowego słowa kluczowego do utworzenia zmiennej typu klasy. Ponieważ nie ma zmiennej instancji, dostęp do członków klasy statycznej odbywa się za pomocą samej nazwy klasy.

Istnieje jednak coś takiego jak konstruktor statyczny. Każda klasa może mieć jedną z nich, w tym klasy statyczne. Nie można ich bezpośrednio wywoływać. & nie może mieć parametrów (innych niż parametry dowolnego typu w samej klasie). Statyczny konstruktor jest wywoływany automatycznie w celu zainicjowania klasy przed utworzeniem pierwszej instancji lub odniesienia do jakichkolwiek statycznych elementów. Wygląda następująco:

klasa statyczna Foo() { static Foo() { Bar = "fubar"; }

public static string Bar { get; set; } 

}

Klasy statyczne są często używane jako usługi, można ich używać tak:

MyStaticClass.ServiceMethod (...);

1

Zastosowanie tej metody 'statyczne'

Na pierwszej etykiety Kontrola modyfikatorów własności = publiczna

w kodzie programu poniżej

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

w kodzie Form1 poniżej

Program.frm2.show(); 

w Kod Form2 poniżej

label1.Text=Program.frm1.text;