C# Auf andere Klasse über mehrere Formen zugreifen

_Headsh0t_

Ensign
Registriert
Juni 2011
Beiträge
227
Der Titel klingt ganz simpel. Ich habe 2 Formen und eine weitere Klasse mit dem Namen Calulcation.cs

In der Calculation-Klasse werden diverese Rechnungen durchgeführt und Ergebnise in Variablen gespeichert.
In der 1. Form wird dann eine Rechnung aufgerufen. Dort habe ich bereits eine Referenz erstellt
Code:
Calculation calc = new Calculation();
Code:
        private void Button1_Click(object sender, EventArgs e)
        {
            double bera = double.Parse(txtBeratungskosten.Text);
            double notar = double.Parse(txtNotarkosten.Text);
            double kaufs = double.Parse(txtKaufsumme.Text);
            double gewerb = double.Parse(txtGewerbeamt.Text);
            double amts = double.Parse(txtAmtsgericht.Text);
       
           calc.SetZwischensumme1(bera,notar,kaufs,gewerb,amts);
          
            frm2.Show();
            
           
        }
Nun soll in der 2. Form eine Zwischensumme1 aufgerufen werden.
Da muss ich aber ja erstmal mit einer Referenz auf die Klasse Calculation zugreifen. Schreibe ich dann wieder
Code:
 Calculation calc = new Calculation();
wird ja eine komplett Referenz erstellt und die Ergebnise aus Form1 sind nicht vorhanden.

Was muss ich also machen, um in Form1 etwas über die Calculation-Klasse ausrechnen zu lassen und in Form2 dann auf die Ergebnise zugreifen kann?
 
Du nimmst die Variable einfach in die Klasse auf (nicht lokal in der Funktion) und setzt sie internal/public.
 
Hm dem Konstruktor des zweiten Forms das Ergebnis als Parameter mitgeben?

Form frm2 = new AnzeigeForm(double ergebnis);

AnzeigeForm muss dann eine Klasse sein die von Form erbt.
 
Hi,

nicht böse gemeint, aber ich denke, du solltest dir die Grundprinzipien der objektorientierten Programmierung nochmal zu Gemüte führen!

wird ja eine komplett Referenz erstellt und die Ergebnise aus Form1 sind nicht vorhanden.

Da wird keine "Referenz" erstellt sondern ein Objekt, also eine Instanz der Klasse! Also, nochmal genau einlesen in das Ganze! Das liest sich sehr nach Halbwissen und das ist bekanntlich gefährlich ;)

VG,
Mad
 
Naja, eigentlich macht man das ja (bei Winforms) mit MVC-Pattern, wo du dem Controller einfach über den Konstruktor eine Instanz mitgeben kannst.

Aber ums mal abzukürzen: Erstell einfach im Code-Behind der 2. Form ein Property von diesem Typen, den du vor Show() einfach setzt.
 
Da gibts mannigfaltige Möglichkeiten. Entweder übergibst du an frm2 eine Referenz auf calc (entweder im Konstruktor oder über Getter/Setter) oder direkt das Zwischenergebnis (ebenfalls im Konstruktor oder über Getter/Setter).
 
die Variable?

Wenn du bera, notar etc. meinst, die sind alle schon in der Calculation Klasse deklariert.
Geht ja darum, dass ich aus Form1 und Form2 auf die Variablen der CalculationKlasse zugreifen kann. Das geht aber irgendwie nicht, wenn ich in jeder Form eine neue Referenz calc erstelle.

Ich habe gerade erst angefangen mit C#, hab mich vorher nie wirklich mit objenktorientiertem Programmieren auseinandergesetzt und bring die Begrifflichkeiten teilweise durcheinander

WingX schrieb:
Da gibts mannigfaltige Möglichkeiten. Entweder übergibst du an frm2 eine Referenz auf calc (entweder im Konstruktor oder über Getter/Setter) oder direkt das Zwischenergebnis (ebenfalls im Konstruktor oder über Getter/Setter).

Wie würde das dann aussehen?
 
Zuletzt bearbeitet:
Du erzeugst eine neue Instanz.

Und zu sagen, wie es am elegantesten aussehen würde für deinen Code, ist kaum möglich, wenn keine Details bekannt sind, wer wie wann was instantiiert...

@PichlAlex: Wieso sollte eine Fabrik-Methode das Problem lösen? oO
 
Quellcode:
Calculation.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Kapitalbedarfskalkulation
{
    class Calculation 
    {
        public double beratungskosten;
        public double notarkosten;
        public double kaufsumme;
        public double gewerbeamt;
        public double amtsgericht;
        public double zwischensumme1;

        public double[] löhnegehälter = new double[3];
        public double[] sonstbetraufw = new double[3];
        public double[] abschreibungen = new double[3];
        public double[] sozialeabgaben = new double[3];
        public double[] zinsaufw = new double[3];
        public double[] steuern = new double[3];
        public double[] pachtkosten = new double[3];
        public double[] unplanbares = new double[3];
        public double[] forderungsabschr = new double[3];
        public double[] zwischensumme2 = new double[3];
        public double kapitalbedarf;


        public void SetZwischensumme1(double ber, double notar, double kaufs, double gewerb, double amts)
        {
            this.beratungskosten = ber;
            this.notarkosten = notar;
            this.kaufsumme = kaufs;
            this.gewerbeamt = gewerb;
            this.amtsgericht = amts;

            this.zwischensumme1 = beratungskosten + notarkosten + kaufsumme + gewerbeamt + amtsgericht;
        }

      
        public double GetZwischensumme1()
        {
            return this.zwischensumme1;
        }

        public void SetZwischensumme2(int i,double löhn, double sonstbetr, double abschr, double sozial,double zinsa, double steuern, double pacht, double unplan, double ford)
        {
            this.löhnegehälter[i] = löhn;
            this.sonstbetraufw[i] = sonstbetr;
            this.abschreibungen[i] = abschr;
            this.sozialeabgaben[i] = sozial;
            this.zinsaufw[i] = zinsa;
            this.steuern[i] = steuern;
            this.pachtkosten[i] = pacht;
            this.unplanbares[i] = unplan;
            this.forderungsabschr[i] = ford;
        }

        
        public void DoZwischensumme2()
        {
            zwischensumme2[0] = this.löhnegehälter[0]+this.sonstbetraufw[0]+this.abschreibungen[0]+this.sozialeabgaben[0]+this.steuern[0]+this.pachtkosten[0]+this.unplanbares[0]+this.forderungsabschr[0];
            zwischensumme2[1] = this.löhnegehälter[1]+this.sonstbetraufw[1]+this.abschreibungen[1]+this.sozialeabgaben[1]+this.steuern[1]+this.pachtkosten[1]+this.unplanbares[1]+this.forderungsabschr[1];
            zwischensumme2[2] = this.löhnegehälter[2] + this.sonstbetraufw[2] + this.abschreibungen[2] + this.sozialeabgaben[2] + this.steuern[2] + this.pachtkosten[2] + this.unplanbares[2] + this.forderungsabschr[2];
           
        }

       
        public void SetKapitalbedarf()
        {
            this.kapitalbedarf = this.zwischensumme2[0] + this.zwischensumme2[1] + this.zwischensumme2[2] + this.zwischensumme1;
        }
        public double GetKapitalbedarf()
        {
            return this.kapitalbedarf;
        }
       
    }
     
}

Form1
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Kapitalbedarfskalkulation
{
    public partial class frm1 : Form
    {
        Calculation calc = new Calculation();
  
        Form2 frm2 = new Form2();

        public frm1()
        {
            InitializeComponent();
           
          
        }

       
        private void Button1_Click(object sender, EventArgs e)
        {
            double bera = double.Parse(txtBeratungskosten.Text);
            double notar = double.Parse(txtNotarkosten.Text);
            double kaufs = double.Parse(txtKaufsumme.Text);
            double gewerb = double.Parse(txtGewerbeamt.Text);
            double amts = double.Parse(txtAmtsgericht.Text);
         // calc.SetZwischensumme1(double.Parse(txtBeratungskosten.Text), double.Parse(txtNotarkosten.Text), double.Parse(txtKaufsumme.Text), double.Parse(txtGewerbeamt.Text), double.Parse(txtAmtsgericht.Text));
           calc.SetZwischensumme1(bera,notar,kaufs,gewerb,amts);
          
            frm2.Show();
            frm2.label1.Text = calc.GetZwischensumme1().ToString();
            
           
        }

        private void Label7_MouseHover(object sender, EventArgs e)
        {
            pnlInfo.Visible = true;
        }

        private void Label7_MouseLeave(object sender, EventArgs e)
        {
            pnlInfo.Visible = false;
        }

        private void frm1_Load(object sender, EventArgs e)
        {

        }

       
       
      
       
    }
}
Form2
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Kapitalbedarfskalkulation
{
    public partial class Form2 : Form
    {
       // frm1 frm = new frm1();
        Calculation calc = new Calculation();
        double a;

        int i = 0;
        public Form2()
        {
            InitializeComponent();
           
           
        }

      
        private void Button1_Click(object sender, EventArgs e)
        {
           if (i <3)
           {
               
               calc.SetZwischensumme2(i, double.Parse(TextBox1.Text), double.Parse(TextBox2.Text), double.Parse(TextBox3.Text), double.Parse(TextBox4.Text), double.Parse(TextBox5.Text), double.Parse(TextBox6.Text), double.Parse(TextBox7.Text), double.Parse(TextBox8.Text), double.Parse(TextBox9.Text));
            i++;
            lblround.Text = i + 1 + (". Geschäftsjahr");
           }

           if (i == 3)
           {
               calc.DoZwischensumme2();
               calc.SetKapitalbedarf();
               lblerg.Text = calc.GetKapitalbedarf().ToString();
           }
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            lblround.Text = i + 1 + (". Geschäftsjahr");
        //    double testz = calc.GetZwischensumme1();
         //   lblTestZ.Text = testz.ToString();
             a = calc.gewerbeamt;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            double testz = calc.zwischensumme1;
            
            
        }

        private void Button3_Click(object sender, EventArgs e)
        {
            label1.Text = a.ToString();
            label21.Text = calc.notarkosten.ToString();
        }

       
    }
   
}

In Form2 soll einfach der Kapitalbedarf ausgerechnet werden.
Dieser wird ja so ausgerechnet:
Code:
 public void SetKapitalbedarf()
        {
            this.kapitalbedarf = this.zwischensumme2[0] + this.zwischensumme2[1] + this.zwischensumme2[2] + this.zwischensumme1;
        }

Rufe ich this.zwischensumme1 in Form2 auf, so ist der Wert allerdings = 0 obwohl der in Form1 berechnet wurde.
 
Zuletzt bearbeitet:
In die Richtung würde meine Variante gehen...
Klassennamen schreibt man üblicherweise mit großem Anfangsbuchstaben... allgemein solltest du mehr Wert auf Namensgebung legen... Zwischensumme1 und Zwischensumme2 sind jetzt nicht unbedingt Dinge, unter denen man sich was vorstellen kann... die Formeln kommen ja vermutlich nicht von Ungefähr, kann mir kaum vorstellen dass die Dinger da nur Zwischensumme genannt wurden...

Form1
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Kapitalbedarfskalkulation
{
    public partial class frm1 : Form
    {
        private Calculation calc;
        private Form2 frm2;
 
        public frm1()
        {
            calc = new Calculation();
            frm2 = new Form2(calc);
            InitializeComponent();
        }
        
        ...

Form2
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Kapitalbedarfskalkulation
{
    public partial class Form2 : Form
    {
        private Calculation calc;
        private double a;
        private int i = 0;
        
        public Form2(Calculation calc)
        {
            this.calc = calc;
            InitializeComponent();
        }
        
        ...
 
Zuletzt bearbeitet:
Dann gibt er mir hier einen Fehler aus
Code:
   public Form2(Calculation calc)
        {
            this.calc = calc;
            InitializeComponent();
        }
Fehler 1 Inkonsistenter Zugriff: Parametertyp "Kapitalbedarfskalkulation.Calculation" ist weniger zugreifbar als Methode "Kapitalbedarfskalkulation.Form2.Form2(Kapitalbedarfskalkulation.Calculation)"


Form2 wird unterstrichen
 
Zuletzt bearbeitet:
Habs hinbekommen.
Musste
Code:
 internal Form2(Calculation calc)
        {
            this.calc = calc;
            InitializeComponent();
        }
sein.

Nur, was bedeutet das internal genau?
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben