Forum: PC-Programmierung C#: Werte in andere Forms übertragen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel I. (runlo)


Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Gemeinde!

für meine praktische Prüfung in Informatik mache ich eine Art 
"Fragenauswertung"

Programm: Visual Studio

Prinzip sieht folgendermaßen aus:

Du beantwortest eine Frage, drückst bestätigen, das Fenster geht zu und 
ein neues Fenster mit der nächsten Frage erscheint usw. Bis man halt auf 
Auswerten drückt.

Mein Problem liegt hierbei jedoch bei der Übergabe der Werte, ich häng 
seit heute 7:00 Uhr an den Problem :D

Ich habe für jede Klasse eine Form und zusätzlich eine Klasse 
"Berechnung".
In der Klasse Berechnung will ich alle Variablen zum Berechnen haben und 
diese anschließend mit Methoden verrechnen. Das soll jetzt aber nicht 
das Thema sein.

Hier mal die relevanten Codestellen für 1 Frage und der Klasse 
Berechnung

_________________________________________________________________

Form "Alter":

public partial class Alter : Form
    {

        public Alter()
        {
            InitializeComponent();
            l_age.Text = "Wie alt sind Sie " + Variablen.str_User + "?";
        }



        #region Bestätigen
        private void b_confirmage_Click(object sender, EventArgs e)
        {
            Berechnung MyBerechnungAlter = new Berechnung();
            MyBerechnungAlter.Alter = Convert.ToInt32(NUD_Age.Value);

            Zyklus MyZyklus = new Zyklus();
            MyZyklus.Show();
            this.Close();
        }
        #endregion
    }

Klasse "Berechnung":

class Berechnung
    {
        /// <summary>
        /// Instanzvariablen
        /// </summary>
        private int i_BAlter;
        private int i_BZyklus;

        /// <summary>
        /// Konstruktor zum initialisieren der Instanzvariablen Alter 
und Zyklus
        /// </summary>
        public Berechnung()
        {
            i_BAlter = 0;
            i_BZyklus = 0;
        }

        #region Eigenschaften
        /// <summary>
        /// Eigenschaft zu Alter
        /// </summary>
        public int Alter
        {
            set { i_BAlter = value; }
            get { return i_BAlter; }
        }

        /// <summary>
        /// Eigenschaft zu Zyklus
        /// </summary>
        public int Zyklus
        {
            set { i_BZyklus = value; }
            get { return i_BZyklus; }
        }
        #endregion

        );

    }
_________________________________________________________________

Der Fehler liegt ja daran, dass ich immer wieder neue Objekte erstelle 
und Sie mit dne Setter und Getter nur mit der einen Variable füttere. 
Die Anderen Variablen bleiben 0;

also beim Objekt MyBerechnungAlter ist i_BAlter mit einen Wert versehen, 
i_BZyklus jedoch nicht.
bei MyBerechnungZyklus ist es genau umgekehrt.
Zudem kann ich unter "Berechnungen" ja auch nicht darauf zugreifen, da 
beide in den Click-Events der anderen Forms sind, wie ich das verstanden 
habe.

Ich bräuchte halt ein Objekt, welches am Ende jeden Wert hat, die ganzen 
Variablen müssen jedoch private bleiben.

Alternativ würde auch gehen, dass ich die einzelnen Objekte in der 
Klasse Berechnung abfragen kann, was aktuell nicht geht.

Hab auch schon versucht mit den Konstruktor zu arbeiten, also irgendwie 
die Werte der Setter und Getter auf den Konstruktor zu übertragen, was 
mir aber wohl nix hilft, da ich ja dann schon ein Objekt habe.
Per Objektübergabe mit this hab ichs auch schon probiert, wieder nicht 
geklappt.

Ich weiß, ich drücke mich ziemlich unklar aus, bin bezüglich Erklärungen 
geben echt nicht gut :)

Wir programmieren erst seit diesem Semester mit C#, falls das 
weiterhilft.

Grüße! :)

Und schöne Feiertage!

: Bearbeitet durch User
von Dominik L. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal Sachen wie den "static"-Modifizierer an. Möglich wäre es 
vielleicht mit diesem un einer List<> zu arbeiten...
Alternativ könntest Du vielleicht mit einem minimalen Datenbanksystem 
wie sqlite arbeiten ohne zusätzlich viel Aufwand zu betrieben.

Kommt natürlich alles immer auf Deine Gegebenheiten an!

von Daniel I. (runlo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mit static sollten wir laut Prof nicht arbeiten, wirkt sich aus irgend 
einem Grund negativ auf die Zensur aus.
Mit Datenbanken habe ich noch keine Ahnung, unser derzeitiger 
Wissensstand geht bis ca 1.20 auf dem Bild

Mit Basics für Anfänger werde ich hier wohl nicht weit kommen oder? :/

: Bearbeitet durch User
von Dominik L. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mh.. okay unter den Voraussetzungen muss Du natürlich mit weniger 
Auskommen.

Ich würde es ganz simpel machen, indem ich mit 
"System.Windows.Forms.Form.ShowDialog()" arbeiten würde. Immer mit dem 
Rückgabewert die Funktion füttern und am Ende alles in die Klasse 
"Berechnung" übermitteln. Oder sprengt das auch wieder die Vorgabe vom 
Prof. ?

von Daniel I. (runlo)


Bewertung
0 lesenswert
nicht lesenswert
Ich denke nicht :)

"Form.ShowDialog: Zeigt das Formular als modales Dialogfeld an."
Was bedeutet das konkret?

von Dominik L. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Naja, Du hast doch geschrieben:
"Du beantwortest eine Frage, drückst bestätigen, das Fenster geht zu und
ein neues Fenster mit der nächsten Frage erscheint usw."

Mit dem ShowDialog würde ich dann ca. so vorgehen:
1
Form2 Frage1testDialog = new Form2();
2
3
if (Frage1testDialog.ShowDialog(this) == DialogResult.OK)
4
{
5
this.txtResult1.Text = Frage1testDialog.TextBox1.Text; //In der Form2 ist ein Control TextBox1, dieses enthält das erste Ergebnis
6
}
7
else
8
{
9
   return:
10
}
11
12
Form3 Frage2testDialog = new Form3();
13
14
if (Frage2testDialog.ShowDialog(this) == DialogResult.OK)
15
{
16
this.txtResult2.Text = Frage2testDialog.TextBox1.Text; //In der Form3 ist wieder ein Control TextBox1, dieses enthält das erste Ergebnis
17
}
18
else
19
{
20
   return:
21
}
22
23
//Dann die Berechnung füllen:
24
Berechnung MyBerechnungAlter = new Berechnung();
25
MyBerechnungAlter.Frage1Value = this.txtResult1.Text;
26
MyBerechnungAlter.Frage2Value = this.txtResult2.Text;
27
MyBerechnungAlter.DoCalc();
28
29
textBoxResult.Text = MyBerechnungAlter.Eregbnis.ToString();

von Daniel I. (runlo)


Bewertung
0 lesenswert
nicht lesenswert
Alles klar, das kommt dann in die Klasse "Berechnungen", die 
ControlTextboxen dann in die Forms der jeweiligen Frage wie ich das 
verstanden habe. Ich probier das mal aus und lass euch vom Resultat 
wissen!


Danke bis da hin Dominik!

von Sven L. (sven_rvbg)


Bewertung
0 lesenswert
nicht lesenswert
Warum nicht einem Formular, das die Steuerelemente dynamisch erzeugt und 
alle Fragen  Antworten  etc. aus  in ein Array  Liste laden?

von HP (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sven L. schrieb:
> Warum nicht einem Formular, das die Steuerelemente dynamisch erzeugt und
> alle Fragen  Antworten  etc. aus  in ein Array  Liste laden?

Weil das eine Idee ist, für deren Umsetzung dich jeder Programmierer 
wahlweise hassen oder bemitleiden würde ;)

von single Instance (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Leg die Klasse "Berechnung" als Single Instance an.

von Sven L. (sven_rvbg)


Bewertung
0 lesenswert
nicht lesenswert
HP schrieb:
> Weil das eine Idee ist, für deren Umsetzung dich jeder Programmierer
> wahlweise hassen oder bemitleiden würde ;)

Wegen Warum? DB hat er noch nicht gehabt, und für jede Frage eine neue 
Form zu erstellen scheint auch nicht das Wahre?

Deine Lösung würde wie aussehen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.