Przekazywanie parametru z Form2() do Form1()

Przekazywanie parametru z Form2() do Form1()
0

Witam
Mam problem w napisaniu programu. W pierwszej formie mam richtextbox. Klikam przycisk i wyświetla mi się druga forma.
Uzupełniam dane w drugiej formie i chcę, żeby po kliknięciu przycisku druga forma się zamykała i dane pojawiały się w pierwszej formie.

m_Lesiu
nie piszę w C#, ale prawdopodobnie potrzebujesz zrobić swój event.
madmike
@TLesiu, nie piszesz w c# to nie próbuj pomagać w c# :/
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
2

Potrzebujesz referencji formy 1 na formie 2. Utwórz pole typu formy 1 i w konstruktorze formy 2 przekaż tę pierwszą. Dalej to tylko w evencie przycisku na formie drugiej (kiedy zamykasz) wklepujesz kod tak aby pozmieniać dane w formie 1.

Kopiuj
// w formie 2
Form1 form1;

Form2(Form1 form)
{
    this.form1 = form;
}

// w evencie
form1.[...]; // itd.

Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
mr_jaro
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
0

Tak jak mówi @xeo545x39 + nie zapomnij oznaczyć tych pól które chcesz zmieniać poprzez form 2 jako publiczne.


It's All About the Game.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:7 dni
  • Lokalizacja:Wrocław
2
mr_jaro napisał(a):

Tak jak mówi @xeo545x39 + nie zapomnij oznaczyć tych pól które chcesz zmieniać poprzez form 2 jako publiczne.

Nie upubliczniaj pól, lepiej napisz publiczne metody, które na tych polach zrobią to, co potrzebujesz.

http://pl.wikipedia.org/wiki/Hermetyzacja_%28informatyka%29

edytowany 1x, ostatnio: somekind
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Zastosowałem rozwiązanie xeo545x39, bo mam taki sam problem, ale cały czas wartości z pierwszej formy nie są przekazywane do drugiej.
Sory za uciążliwe nazwy zmiennych i bałagan w kodzie.
Chodzi o to, że w zmiennej "przeciwdziedzina..." przy debugowaniu cały czas mam wartosc 0.0. Pomocy!

Kopiuj
public partial class GranicaFunkcjiLiniowej : Form
    {
        
        
        public calosc cal;
       
        public GranicaFunkcjiLiniowej()
        {
            InitializeComponent();
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            
        }
        public GranicaFunkcjiLiniowej(calosc c)
        {
            this.cal = c;
        }
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {

            cal = new calosc();
            
            cal.wykres_funkcja_liniowa.Series["wykres"].Points.Clear();
            cal.wykres_funkcja_liniowa.Series["granica"].Points.Clear();
            for (cal.dziedzina_funkcji_liniowej = cal.zmienna_x_funkcji_liniowej - 20; cal.dziedzina_funkcji_liniowej < cal.zmienna_x_funkcji_liniowej + 20; cal.dziedzina_funkcji_liniowej++)
            {
                cal.przeciwdziedzina_funkcji_liniowej = cal.wspolczynnik_a_funkcji_liniowej * cal.dziedzina_funkcji_liniowej + cal.wspolczynnik_b_funkcji_liniowej;
                cal.wykres_funkcja_liniowa.Series["wykres"].Points.AddXY(cal.dziedzina_funkcji_liniowej, cal.przeciwdziedzina_funkcji_liniowej);
            }
            cal.wartosc_granicy_funkcji_liniowej = cal.wspolczynnik_a_funkcji_liniowej * cal.zmienna_x_funkcji_liniowej + cal.wspolczynnik_b_funkcji_liniowej;
            cal.wykres_funkcja_liniowa.Series["granica"].Points.AddXY(cal.zmienna_x_funkcji_liniowej,cal.wartosc_granicy_funkcji_liniowej);
            cal.wykres_funkcja_liniowa.Series["granica"].Points[0].Color = Color.Red;
            cal.wykres_funkcja_liniowa.Series["granica"].Points[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
            cal.panel_funkcji_liniowej.Enabled = true;
            this.Close();

        }
    }
 
edytowany 1x, ostatnio: finito
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
1

No przecież w konstruktorze przekazujesz instancje calosc to po co później w metodzie robisz cal = new calosc?

FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0
some_ONE napisał(a):

No przecież w konstruktorze przekazujesz instancje calosc to po co później w metodzie robisz cal = new calosc?

Jak nie robię new calosc, to vs wyrzuca taki wyjątek:
"Object reference not set to an instance of an object."

FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Dziwna sprawa. Jak na górze w partialu daję public calosc cal = new calosc();, to mnie nie wypluwa. Ponadto wartosc panel.enabled mogę zmienić na true (i to jest okej), ale już zwykłe zmienne z klasy głównej formy Uwaga!! w drugiej klasie są wszystkie na 0.0, choć w klasie głównej formy wszystkie zmienne wartości mają taką wartośc, jakią mieć powinny.

Tzn. chodzi mi już o zwykłe zmienne typu double, które są zadeklarowane w partialu w głównej formie. W klasie głównej formy wszystke mają zadaną wartość. Jednak te same zmienne w tej drugiej klasie, są już na 0.0

Dlaczego? Nie wiem.

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0

Ja wiem dlaczego.
W klasie GranicaFunkcjiLiniowej tworzysz nową instancję klasy calosc, więc jakim cudem ma ona zawierać wartości z głównej formy? -.-

Pokaż więcej kodu, musisz mieć coś mocno namieszane, albo nieprawdą jest, że jak dasz calosc cal = new calosc(); to później możesz na głównej formie zmienić panel.Enabled.

FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

W rzeczy samej panel_funkcji_liniowej.enabled zmienia się z false na true.Serio. To akurat działa. Poza tym gdy w evencie drugiej formy daję calosc.[...], widzieć widzimi mi wszystkie zmienne double. Tylko przy debagowaniu zauważyłem, że te same zmienne w drugiej klasie mają wartość 0.0 Jaja że hej;-)
W partial głównej formy:

Kopiuj
 
public static double wspolczynnik_a_funkcji_liniowej { get; set; }
        public static double zmienna_x_funkcji_liniowej {get;set;}
        public static double wspolczynnik_b_funkcji_liniowej { get; set; }

        public static double przeciwdziedzina_funkcji_liniowej { get; set; }
        public static double wartosc_granicy_funkcji_liniowej { get; set; }
        public static double dziedzina_funkcji_liniowej {get;set;}

Kopiuj
private void oblicz_granice_funkcji_liniowej_Click(object sender, EventArgs e)
        {
            granica_funkcji_liniowej = new GranicaFunkcjiLiniowej();
            panel_funkcji_liniowej.Enabled = false;
            granica_funkcji_liniowej.Show();
            granica_funkcji_liniowej.FormClosed += (o, args) => panel_funkcji_liniowej.Enabled = true;
            
            
        }
 

Klasa partial drugiej formy:

Kopiuj
 
public partial class GranicaFunkcjiLiniowej : Form
    {
        

        public calosc calosc;
        
        
        public GranicaFunkcjiLiniowej()
        {
            InitializeComponent();
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            
        }
        public GranicaFunkcjiLiniowej(calosc c)
        {
            this.calosc = c;
        }
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {

            
            
            calosc.wykres_funkcja_liniowa.Series["wykres"].Points.Clear();
            caloscwykres_funkcja_liniowa.Series["granica"].Points.Clear();
            for (calosc.dziedzina_funkcji_liniowej = calosc.zmienna_x_funkcji_liniowej - 20; calosc.dziedzina_funkcji_liniowej < calosc.zmienna_x_funkcji_liniowej + 20; calosc.dziedzina_funkcji_liniowej++)
            {
                calosc.przeciwdziedzina_funkcji_liniowej = calosc.wspolczynnik_a_funkcji_liniowej * calosc.dziedzina_funkcji_liniowej + calosc.wspolczynnik_b_funkcji_liniowej;
                calosc.wykres_funkcja_liniowa.Series["wykres"].Points.AddXY(calosc.dziedzina_funkcji_liniowej, calosc.przeciwdziedzina_funkcji_liniowej);
            }
            calosc.wartosc_granicy_funkcji_liniowej = calosc.wspolczynnik_a_funkcji_liniowej * calosc.zmienna_x_funkcji_liniowej + calosc.wspolczynnik_b_funkcji_liniowej;
            calosc.wykres_funkcja_liniowa.Series["granica"].Points.AddXY(calosc.zmienna_x_funkcji_liniowej, calosc.wartosc_granicy_funkcji_liniowej);
            calosc.wykres_funkcja_liniowa.Series["granica"].Points[0].Color = Color.Red;
            calosc.wykres_funkcja_liniowa.Series["granica"].Points[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
            calosc.panel_funkcji_liniowej.Enabled = true;
            this.Close();

        }
    }
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

To gdzie mam dać "public calosc cal", żeby mieć w drugiej formie sensowny dostęp do zmiennych z formy głównej? Jak daję go w drugiej formie, to vs widzi w klasie drugiej formy zmienne double z formy głównej, ale wartości ma już że tak powiem gdzieś.

FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Some_One, poza tym ja to chciałem zrobić na podstawie właśnie tego, co ma tu:
Z tą różnicą, że jak nie daję "= new calosc()", to mnie wypluwa, a jak daję, to nie wypluwa i widzi te wszystkie zmienne, ale nie ich wartości.

xeo545x39 napisał(a):

Potrzebujesz referencji formy 1 na formie 2. Utwórz pole typu formy 1 i w konstruktorze formy 2 przekaż tę pierwszą. Dalej to tylko w evencie przycisku na formie drugiej (kiedy zamykasz) wklepujesz kod tak aby pozmieniać dane w formie 1.

Kopiuj
// w formie 2
Form1 form1;

Form2(Form1 form)
{
    this.form1 = form;
}

// w evencie
form1.[...]; // itd.
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0
finito napisał(a):

W rzeczy samej panel_funkcji_liniowej.enabled zmienia się z false na true.Serio. To akurat działa.

Działa, ale dlatego, że przecież masz:

Kopiuj
granica_funkcji_liniowej.FormClosed += (o, args) => panel_funkcji_liniowej.Enabled = true;
finito napisał(a):

zauważyłem, że te same zmienne w drugiej klasie mają wartość 0.0 Jaja że hej;-)

Jakie jaja? Co w tym dziwnego?
Tworzysz nową instancję klasy to chyba logiczne, że zawiera te same właściwości(które są domyślnie inicjalizowane 0 dla typów liczbowych).

W pierwszej chwili nie zauważyłem, że to są zmienne statyczne. Nie powinny się zerować, ale tam jest taki bajzel, że nie chce mi się tego analizować.

Kopiuj
granica_funkcji_liniowej = new GranicaFunkcjiLiniowej(); 

Tutaj korzystasz z konstruktora bezparametrowego, więc pole calosc będzie nullem.

Jak tak bardzo chcesz przekazywać do nowej formy tą główną to popraw konstruktor na:

Kopiuj
public GranicaFunkcjiLiniowej(calosc c) : this()
{
    this.calosc = c;
} 

I twórz tę formę z okna głównego w ten sposób:

Kopiuj
granica_funkcji_liniowej = new GranicaFunkcjiLiniowej(this); 

Ale jak dla mnie to przy tym co chcesz robić przekazywanie całej formy nie ma sensu. Możesz po prostu do konstuktora przekazać te kilka wartości, które są potrzebne.
Zresztą, wszystkie twoje pola w klasie Form1 są statyczne więc możesz się do nich odwołać bez przekazywania instancji tej klasy poprzez normalne Form1.wspolczynnik_a_funkcji_liniowej.

No i lepiej siądź do jakiegoś kursu, bo widać, że nie wiesz za bardzo co robisz.

edytowany 2x, ostatnio: some_ONE
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Wiesz, ja to wszystko rozumiem, ale nadal nie wiem w jaki sposób mam zrobić przekazanie zmiennej z jednej formy na drugą. Przecież w tej drugiej formie muszę zadeklarować instancję głównej klasy, bo inaczej nie mam czego przekazać do konstruktora.

Niby jak mam zrobić coś takiego?

Kopiuj
public DrugaForma(calosc c):this()
{
     this.cal = c; 
}
 

bez tego:

Kopiuj
 
private calosc cal;

???
Poza tym chyba coś nie tak zrobiłem, bo przecież w DrugaForma jak dam ":this()", to tak jakbym ustawił dziedziczenie "krzesła w krześle"- zupełnie bez sensu przecież. Słuchaj, jeśli wiesz jak to zrobić, to pokaż mi to skrótem - ja będę wiedział na przyszłość jak to zrobić, a ty będziesz miał ze mną święty spokój.

edytowany 1x, ostatnio: finito
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Zrób sobie publiczne property i ustaw jej co chcesz, a potem z drugiej formy po prostu odczytaj wartość.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0
xeo545x39 napisał(a):

Zrób sobie publiczne property i ustaw jej co chcesz, a potem z drugiej formy po prostu odczytaj wartość.

Tzn. już mi się udało zrobić tak, żeby w drugiej formie widać było wartości. To już jest! Teraz jednak nie rozumiem dlaczego gdy daję polecenia rysujące chart w pętli w evencie w form2, wykres na pierwszej formie nie rysuje się. Sory, potem dam kod, bo teraz matmę robię i nie chcę się za bardzo odrywać.

Jeśli jednak możesz, to napisz w jaki sposób można przy pomocy eventu w form2 (button click) narysować wykres chart, ale żeby rysował się na głównej formie. Tzn. najpierw zadaję wartości w głównej, potem przesyłam te wartości do Form2, a potem przy pomocy button z Form2, rysuję ten chart w głównej. Ja w form2 po prostu zrobiłem:

Kopiuj
 
class Form2{
var f = new  GlownaForma();
f.chart....
}

W skrócie. Ale to mi nie działa. Tzn. chart jest cały biały i tyle.

edytowany 1x, ostatnio: finito
Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

Nie prościej udostępnić publiczną metodę w Form1 odpowiedzialną za rysowaniu chart'u? Np.

Kopiuj
 public void DrawChart() 

która używając publicznych właściwości z Form2 narysuje chart?


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
2

Proponuję przyjrzeć się jak są zrobione eventy w Windows Forms (choćby takie OnClick) i zrobić własne zdarzenie według tej samej konwencji.

FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0
Aventus napisał(a):

Nie prościej udostępnić publiczną metodę w Form1 odpowiedzialną za rysowaniu chart'u? Np.

Kopiuj
 public void DrawChart() 

która używając publicznych właściwości z Form2 narysuje chart?

Stworzyłem taką metodę, ale ona działa tylko wtedy gdy odpalę ją w klasie GłównejFormy. Natomiast gdy w form2 dam:
var cal = new GlownaForma();
cal.DrawChart();
to już się nie rysuje. Podajrzewam, że po prostu cal jest pustą instancją i dlatego wykres się nie rysuje. Nie wiem, myślicie że to o to chodzi?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0

Bo zapomniałeś: cal.Show();


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0
_13th_Dragon napisał(a):

Bo zapomniałeś: cal.Show();

Okej, zauważyłem, rzeczywiście teraz mi już rysuje, ale pierwsze że odpala mi główną formę na nowo i nie zamyka starej, a drugie, że wyświetla mi główny stan formy, a nie ten konkretny tab w tabcontrol. Bo ja mam ten chart w jednym z tabów controlki tabcontrol.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0

Skoro tworzysz główną formę na nowo za pomocą new to czego się spodziewałeś? new - oznacza z angielskiego nowy - UWAGA! nie mylić z: - sięgnij telepatycznie do umysłu autora i sprawdź czego on chce po czym to wykonaj


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Okej, więc na głównej formie w jednej z zakładek tabcontrol mam gui z chartem. Nie mogę kilku buttonów zmieścić w gui głównej formy, więc wpadłem na pomysł, żeby te button umieścić na drugiej formie. Na drugiej formie klikam w jeden z przycisków np. narysuj_wykres_btn i wtedy druga forma się zamyka a na głównej pojawia się w owej zakładce na charcie wykres.

ps. przed chwilą też do mnie dotarło, że tworzy się nowa forma z powodu new.

edytowany 1x, ostatnio: finito
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0

Odpowiedź na to pytanie udzielił ci @xeo545x39 w pierwszym poście tego tematu: http://4programmers.net/Forum/970821


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0
_13th_Dragon napisał(a):

Odpowiedź na to pytanie udzielił ci @xeo545x39 w pierwszym poście tego tematu: http://4programmers.net/Forum/970821

Jak robie w ten sposób, to mnie wypluwa i pojawia się informacja o tym, że obiekt form1 jest pusty. Natomiast gdy robie:
Form1 form1 = new Form1();
to wszystko działa, ale forma główna tworzy się na nowo. Nie drążyłbym tego tematu, gdyby w odpowiedzi @xeo545x39 wszystko grało.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0
finito napisał(a):

Jak robie w ten sposób, to mnie wypluwa i pojawia się informacja o tym, że obiekt form1 jest pusty.
Ponieważ nie przekazałeś form1 do konstruktora.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Przekazałem...

Kopiuj
 
public partial class ObliczGranice : Form
    {
        public static double wspol_a,zmienna_x,wspol_b,przeciwd,wartosc_gr,dziedzina;
        private calosc cal
        public ObliczGranice(double wspa,double zm_x,double wspb,double przec,double wartgr,double dziedz, **calosc c**)
        {
            InitializeComponent();
            wspol_a = wspa;
            zmienna_x = zm_x;
            wspol_b = wspb;
            przeciwd = przec;
            wartosc_gr = wartgr;
            dziedzina = dziedz;
           ** this.cal = c;**
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
        }
        
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {
           
            
           
            cal.DrawCh();

            cal.Show();
            
            this.Close();
        }
    }
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Chyba, że chodzi wam o WYWOŁANIE konstruktora. Tylko, że to jest bez sensu, bo skoro daje instancję głównej formy w Form2, to skąd mam wziąć tę instancję w głównej formie, gdy wywołuje w niej konstruktor Form2.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0
finito napisał(a):

Przekazałem...

Kopiuj
        ...
        private calosc cal
...

To się nawet nie skompiluje, poza tym jak doprowadzisz do stanu kompilacji to jest przyjmowanie parametru, zaś jak przekazujesz nadal nie podałeś.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
FI
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 dni
  • Postów:684
0

Rozumiem, że to jest przekazanie:

Kopiuj
Form2 f2 = new Form2(cal);
 

Skąd jednak mam wyczarować instancję cal (czyli instancję głównej formy) w głównej formie? Bo właśnie dopiero to mi się nie kompiluje tzn. gdy przed konstruktorem głównej formy daję calosc cal = new calosc(); Ewentualnie gdy w evencie głównej formy (tym, ktory odpala form2) daję var cal = new calosc();, to wtedy znowu tworzy się nowa forma główna.

A przecież żeby odpalić konstruktor Form2, muszę posiadać instancję formy głównej, czy nie tak?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.