Komunikacja między klasami

0

Witam,

W jednej formie mam button, który otwiera 'otwiera' kolejną formę:

        private void updateButton_Click(object sender, EventArgs e)
        {
            Form2 myForm2 = new Form2();
            myForm2.ShowDialog();
            myForm2.Dispose();
        } 

Na drugiej formie mam date time picker. Po wybraniu daty i kliknięciu buttona zatwierdzającego wybór, chciałbym by wybrana data pokazała się w labelu na pierwszej formie. Kod buttona wygląda tak:

        private void okButton_Click(object sender, EventArgs e)
        {
            date = getTextBoxValue();
            MessageBox.Show(date);

            anotherDonation = DateTime.Parse(date, culture);
            anotherDonation = anotherDonation.AddDays(56);
            MessageBox.Show(anotherDonation.ToString());

            Form1 myForm1 = new Form1();
            myForm1.Dispose();
            myForm1.anotherDonationLabel.Text = anotherDonation.ToString("dd/MM/yyyy");

            MessageBox.Show(myForm1.anotherDonationLabel.Text);

            this.Close();
        } 

Dopowiem, że modyfikator dostępu labelu ustawiony jest jako public. Ostatni MessageBox pokazuje właściwą datę. Ale niestety, w labelu nic nowego się nie wyświetla. Co robię źle?

Proszę o pomoc.

1

Nie nie nie. Po pierwsze na drugiej formie tworzysz NOWĄ pierwszą. Ty masz użyć starej. Po drugie nie potrzebnie wykonujesz metodę .Dispose();, wcale ci nie jest potrzebna. Jeżeli chcesz się odwołać do poprzedniej formy to musisz przekazać referencję tej formy do tej nowej w konstruktorze. Wtedy, gdy masz odwołanie w 2. formie do 1. to możesz coś zmienić w tej 1.

// forma 1:
Form2 frm2 = new Form2(this);
frm2.Show();


// forma 2:
Form1 frm1; // pole klasy

public Form2(Form1 frm) // w konstruktorze przekazujesz pierwszą formę
{
    frm1 = frm;
}

// i teraz w jakiejś metodzie:
frm1.anotherDonationLabel.Text = anotherDonation.ToString("dd/MM/yyyy");
1
            Form1 myForm1 = new Form1();
            myForm1.Dispose(); // <---
            myForm1.anotherDonationLabel.Text = anotherDonation.ToString("dd/MM/yyyy");

tworzysz formularz i od razu oznaczasz go jako zniszczony

0

Okej, podmieniłem:

Button, Form1:

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

Form2:

public partial class Form2 : Form
    {
        Form1 myForm1;

        public Form2(Form1 myForm1)
        {
            this.myForm1 = myForm1;
        }

        public Form2()
        {
            InitializeComponent();

[...]

        private void okButton_Click(object sender, EventArgs e)
        {
            date = getTextBoxValue();
            MessageBox.Show(date);

            anotherDonation = DateTime.Parse(date, culture);
            anotherDonation = anotherDonation.AddDays(56);
            MessageBox.Show(anotherDonation.ToString());

            myForm1.anotherDonationLabel.Text = anotherDonation.ToString("dd/MM/yyyy"); //<---

            MessageBox.Show(myForm1.anotherDonationLabel.Text);

            this.Close();
        }

Jednakże podczas debugu wyskakuje mi przy próbie wysłania danych do anotherDonationLabel (zaznaczone strzałką), że: "NullReferenceException was unhandled".

Dodatkowo prosiłbym o wyjaśnienie:

xeo545x39 napisał(a):
// forma 1:
Form2 frm2 = new Form2(this);
frm2.Show();

Czemu użyłeś w przykładzie słówka this? Czemu ma to służyć?

1

Dostajesz NullReferenceException, bo nie widzę żebyś przekazywał formę pierwszą przy

Form2 myForm2 = new Form2(/*tu masz wstawić referencję do formy 2., a, że wywołujesz z 1. to wstawiasz this*/);

this to słowo kluczowe zwracające referencję do obiektu, z którego w danym momencie się zwracasz. A więc jak wstawisz w Form1 to zwróci ci ref do formy głównej.

0

Ok, dziękuję serdecznie!

Wszystko działa! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1