[Visual Studio C#]Problem z przekazaniem zmiennej


(Dawidfajkowski) #1

Witam , mam projekt w którym mam dwa formy: Form1 i Form2, z Form1 wywołuje konstruktor parametryczny z Form2 aby przekazać do niego zmienne -

/Metoda w Form1

resize nowa = new resize(wysokosc,szerokosc);

nowa.ShowDialog();

/Konstruktor w Form2

public resize(int wys, int sze)

        {

            InitializeComponent();

            numericUpDown1.Value = wys;

            numericUpDown2.Value = sze;

        }

I teraz mój problem pojawia się gdy chcę przekazać zmienne spowrotem do Form1 podczas zamykania Form2. Proszę o pomoc.

Pozdrawiam


(Cherry515) #2

W klasie Form2:

private Form1 rodzic;


public Form2(int wys, int sze,Form1 parent)

        {

            InitializeComponent();

            this.rodzic=parent;

            numericUpDown1.Value = wys;

            numericUpDown2.Value = sze;

        }

Natomiast jak wywołujesz ten konstruktor to musisz wykonać coś takiego:

Form2 okno = new Form2(wys,szer,this);

okno.Owner=this;

okno.ShowDialog();

Po tym wszystkim będziesz mógł sie odwołać do publicznych pól i metod z Form1.


(Dawidfajkowski) #3

Dzięki za pomoc :slight_smile: mam jeszcze jedną zagwozdkę ponieważ mam dostęp do zmiennych z Form1 ale nie zmienią się one automatycznie muszę najpierw wywołać funkcję w Form1 żeby użył nowych wartości. Próbowałem zrobić tak rodzic.przycisk_Click() ale czepia się o to że nie mam argumentów bo w metodzie są dwie object sender, EventArgs e ale nie wiem co napisać w w wywołaniu funkcji w Form2 żeby to zadziałało.


(Tomek Matz) #4
  1. Metodę ShowDialog(); możesz wywoływać z parametrem (a w zasadzie powinieneś). Wywołanie tej metody będzie wówczas wyglądać następująco ShowDialog(this); Wówczas w obiekcie klasy Form2 będziesz mieć dostęp do obiektu klasy Form1 poprzez właściwość Owner:

    Form1 form1 = (Form1)form2.Owner;

Nie musisz wówczas dodawać dodatkowego parametru do konstruktora klasy Form2, tj. parametru rodzic (i tutaj przy okazji dodam, że powinieneś używać angielskiego nazewnictwa). 2. Jeśli chcesz przekazywać wartości z Form2 do Form1, to możesz również użyć publicznych właściwości (IMO takie rozwiązanie jest czytelniejsze).

Form2 form2 = new Form2();

if (form2.ShowDialog(this) == DialogResult.OK)

{

    MessageBox.Show(form2.Property1);

    MessageBox.Show(form2.Property2);

    itd.

}

form2.Dispose();
  1. Jeśli chcesz wywołać procedurę obsługi zdarzenia np. Click, to parametry musisz przekazać w taki sposób w jaki przekazujesz je do każdej innej procedury:

button_Click(null, null);

button_Click(, new EventArgs());

itp.


(somekind) #5

A najprościej tak:

button.PefrormClick();